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

Artifact 873bbc5dff8eb9f2bf8d9287d29df082eacb8391:


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: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1380: 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1390: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20   references */. 
13a0: 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
13d0: 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61  essing memory ma
13e0: 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20  pping */.  void 
13f0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1400: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61           /* Area
1410: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a   memory mapped *
1420: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1430: 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20  4 mmapSize;     
1440: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1450: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
1460: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1470: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74  nt64 mmapSizeAct
1480: 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73  ual; /* Actual s
1490: 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65  ize of mapped re
14a0: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
14b0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
14c0: 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69  Max;    /* Confi
14d0: 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50  gured FCNTL_MMAP
14e0: 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 7d  _SIZE value */.}
14f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
1500: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
1510: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
1520: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
1530: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20  _RDONLY         
1540: 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65   0x02   /* Conne
1550: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
1560: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ly */.#define WI
1570: 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
1580: 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20  L     0x04   /* 
1590: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
15a0: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ode */.#define W
15b0: 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  INFILE_PSOW     
15c0: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a         0x10   /*
15d0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
15e0: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
15f0: 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  E */../*. * The 
1600: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1610: 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  er used by sqlit
1620: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
1630: 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e  ebug().. */.#ifn
1640: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1650: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20  _DBG_BUF_SIZE.# 
1660: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1670: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
1680: 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d  E   ((int)(4096-
1690: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a  sizeof(DWORD))).
16a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
16b0: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
16c0: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
16d0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
16e0: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
16f0: 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65   * the data dire
1700: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
1710: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
1720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1730: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
1740: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
1750: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1760: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1770: 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (1).#endif../*.
1780: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
1790: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
17a0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
17b0: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
17c0: 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70  that. * the temp
17d0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
17e0: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
17f0: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
1800: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
1810: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
1820: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1830: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
1840: 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23  CTORY_TYPE (2).#
1850: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
1860: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
1870: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1880: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
1890: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
18a0: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
18b0: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
18c0: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
18d0: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
18e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
18f0: 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74  LLOC../*. * If t
1900: 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  his is non-zero,
1910: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
1920: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
1930: 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20  d by the native 
1940: 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74  Win32. * allocat
1950: 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74  or subsystem; ot
1960: 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66  herwise, the def
1970: 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61  ault process hea
1980: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20  p will be used. 
1990: 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67   This. * setting
19a0: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77   has no effect w
19b0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  hen compiling fo
19c0: 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66  r WinRT.  By def
19d0: 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e  ault, this is en
19e0: 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20  abled. * and an 
19f0: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
1a00: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
1a10: 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63   store all alloc
1a20: 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ated 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 2a 2a 2a 2a 2a 0a 20 2a  *************. *
1a80: 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20   WARNING: It is 
1a90: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
1aa0: 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
1ab0: 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d   setting is non-
1ac0: 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20  zero and the. * 
1ad0: 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53           winMemS
1ae0: 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
1af0: 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e   is called (e.g.
1b00: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
1b10: 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20  shutdown. *     
1b20: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20       function), 
1b30: 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61  all data that wa
1b40: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
1b50: 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68  g the isolated h
1b60: 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  eap will. *     
1b70: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d       be freed im
1b80: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e  mediately and an
1b90: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63  y attempt to acc
1ba0: 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20  ess any of that 
1bb0: 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20  freed. *        
1bc0: 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f    data will almo
1bd0: 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73  st certainly res
1be0: 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69  ult in an immedi
1bf0: 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61  ate access viola
1c00: 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.. *********
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: 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  *****. */.#ifnde
1c60: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1c70: 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65  EAP_CREATE.#  de
1c80: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1c90: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20  2_HEAP_CREATE   
1ca0: 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a   (TRUE).#endif..
1cb0: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
1cc0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
1cd0: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
1ce0: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
1cf0: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
1d00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1d10: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
1d20: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
1d30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
1d40: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
1d50: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
1d60: 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20  _SIZE) * \.     
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 20 20 20                  
1d90: 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c    (SQLITE_DEFAUL
1da0: 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34  T_PAGE_SIZE) + 4
1db0: 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a  194304).#endif..
1dc0: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
1dd0: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
1de0: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
1df0: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
1e00: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
1e10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1e20: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1e30: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
1e40: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
1e50: 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e  AX_SIZE  (0).#en
1e60: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65  dif../*. * The e
1e70: 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73  xtra flags to us
1e80: 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68  e in calls to th
1e90: 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49  e Win32 heap API
1ea0: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  s.  This value m
1eb0: 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f  ay be. * zero fo
1ec0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65  r the default be
1ed0: 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e  havior.. */.#ifn
1ee0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1ef0: 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64  _HEAP_FLAGS.#  d
1f00: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
1f10: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20  32_HEAP_FLAGS   
1f20: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
1f30: 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61  .** The winMemDa
1f40: 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ta structure sto
1f50: 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  res information 
1f60: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1f70: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a  Win32-specific.*
1f80: 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  * sqlite3_mem_me
1f90: 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61  thods implementa
1fa0: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
1fb0: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1fc0: 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73  ta winMemData;.s
1fd0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
1fe0: 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   {.#ifndef NDEBU
1ff0: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20  G.  u32 magic;  
2000: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2010: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2020: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2030: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41  . */.#endif.  HA
2040: 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54  NDLE hHeap; /* T
2050: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72  he handle to our
2060: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c   heap. */.  BOOL
2070: 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20   bOwned;  /* Do 
2080: 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20  we own the heap 
2090: 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74  (i.e. destroy it
20a0: 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a   on shutdown)? *
20b0: 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  /.};..#ifndef ND
20c0: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
20d0: 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78  MEM_MAGIC     0x
20e0: 34 32 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a  42b2830b.#endif.
20f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
2100: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65  inMemData win_me
2110: 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64  m_data = {.#ifnd
2120: 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d  ef NDEBUG.  WINM
2130: 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66  EM_MAGIC,.#endif
2140: 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d  .  NULL, FALSE.}
2150: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
2160: 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  G.#define winMem
2170: 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 61 73  AssertMagic() as
2180: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
2190: 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d  ta.magic==WINMEM
21a0: 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23  _MAGIC ).#else.#
21b0: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
21c0: 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69  ertMagic().#endi
21d0: 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  f..#define winMe
21e0: 6d 47 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d  mGetHeap() win_m
21f0: 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73  em_data.hHeap..s
2200: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
2210: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
2220: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  tes);.static voi
2230: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
2240: 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74  d *pPrior);.stat
2250: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
2260: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
2270: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
2280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
2290: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
22a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
22b0: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
22c0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
22d0: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
22e0: 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63  AppData);.static
22f0: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
2300: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
2310: 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c  ata);..const sql
2320: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
2330: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
2340: 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64  in32(void);.#end
2350: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
2360: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
2370: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2380: 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e  g variable is (n
2390: 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63  ormally) set onc
23a0: 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e  e and never chan
23b0: 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65  ges.** thereafte
23c0: 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77  r.  It records w
23d0: 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61  hether the opera
23e0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
23f0: 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54  in9x.** or WinNT
2400: 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65  ..**.** 0:   Ope
2410: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e  rating system un
2420: 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f  known..** 1:   O
2430: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2440: 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20  is Win9x..** 2: 
2450: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
2460: 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  em is WinNT..**.
2470: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66  ** In order to f
2480: 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e  acilitate testin
2490: 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73  g on a WinNT sys
24a0: 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69  tem, the test fi
24b0: 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e  xture.** can man
24c0: 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76  ually set this v
24d0: 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75  alue to 1 to emu
24e0: 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76  late Win98 behav
24f0: 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ior..*/.#ifdef S
2500: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2510: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
2520: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
2530: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f   int sqlite3_os_
2540: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
2550: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
2560: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
2570: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
2580: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
2590: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25a0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
25b0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
25c0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
25d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
25e0: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
25f0: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
2600: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
2610: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
2620: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
2630: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
2640: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
2650: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
2660: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
2670: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
2680: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
2690: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
26a0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
26b0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
26c0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
26d0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
26e0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
26f0: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
2700: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
2710: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
2720: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
2730: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2740: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
2750: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2770: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2780: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2790: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
27a0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
27b0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
27c0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
27d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
27e0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
27f0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
2800: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
2810: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
2820: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2830: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2840: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
2850: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
2860: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
2870: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
2880: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2890: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
28a0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
28b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
28d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
28e0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
28f0: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
2900: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
2910: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
2920: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
2930: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
2940: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2950: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2960: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2970: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
2980: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
2990: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
29a0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
29b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
29c0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
29d0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
29e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2a10: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
2a20: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
2a30: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
2a40: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
2a50: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
2a60: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
2a70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2a80: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
2a90: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2ab0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2ad0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
2ae0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
2af0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2b00: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2b10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2b20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2b30: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
2b40: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
2b50: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
2b60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2b70: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2b90: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
2ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
2bb0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
2bc0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
2bd0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
2be0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2bf0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2c00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2c10: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2c20: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
2c30: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2c40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
2c70: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
2c80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2c90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2ca0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2cb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2cc0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
2cd0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
2ce0: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
2cf0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
2d00: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
2d10: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
2d20: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
2d30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2d40: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2d50: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
2d60: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2d70: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
2d80: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
2d90: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
2da0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
2db0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2dc0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
2dd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2de0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2e10: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
2e20: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
2e30: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
2e40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
2e50: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
2e60: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
2e70: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
2e80: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e90: 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49  ent)..#if (!SQLI
2ea0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
2eb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2ec0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
2ed0: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
2ee0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2ef0: 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74  WAL)).  { "Creat
2f00: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
2f10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2f20: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
2f30: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
2f40: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2f50: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
2f60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2f90: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2fa0: 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48  FileMappingA ((H
2fb0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
2fc0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
2fd0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
2fe0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
2ff0: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29  RD,DWORD,LPCSTR)
3000: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3010: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3020: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
3030: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3040: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3050: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3060: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
3070: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3080: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
3090: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
30a0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
30b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
30c0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
30d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
30e0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
30f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3110: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3120: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3130: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3140: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3150: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3160: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3170: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3180: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3190: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
31a0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
31b0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
31c0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
31d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
31e0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
31f0: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
3200: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3210: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
3220: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3230: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3240: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3250: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3280: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
3290: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
32a0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
32b0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
32c0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
32d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
32e0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
32f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3300: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3310: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
3320: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3330: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
3340: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
3350: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3360: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
3370: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3380: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
33a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
33b0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
33c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
33d0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
33e0: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
33f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3400: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3410: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
3420: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3430: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
3440: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
3450: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3460: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
3470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3480: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34b0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
34c0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
34d0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
34e0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
34f0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3500: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
3510: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
3520: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
3530: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3540: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
3550: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
3560: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3570: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
35a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
35b0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
35c0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
35d0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
35e0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
35f0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
3600: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
3610: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3620: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
3630: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
3640: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
3650: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
3660: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
3670: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
3680: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
3690: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
36c0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
36d0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
36e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
36f0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
3700: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
3710: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
3720: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
3730: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
3740: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
3750: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
3760: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
3770: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
3780: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
3790: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
37a0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
37b0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
37c0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
37d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
37e0: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
37f0: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
3800: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
3810: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
3820: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3830: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
3840: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
3850: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3880: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
3890: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
38a0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
38b0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
38c0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
38d0: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
38e0: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
38f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3900: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3910: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3920: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
3930: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
3940: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
3950: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
3960: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3970: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
3980: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3990: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
39c0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
39d0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
39e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
39f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3a00: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3a10: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
3a20: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
3a40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3a50: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
3a60: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
3a70: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
3a80: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
3a90: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
3aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3ab0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3b00: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
3b10: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3b20: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
3b30: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
3b40: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
3b50: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
3b60: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
3b70: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
3b80: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
3b90: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
3ba0: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
3bb0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
3bc0: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
3bd0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3be0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c00: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3c10: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
3c20: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
3c30: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
3c40: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
3c50: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
3c60: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
3c70: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3c80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3c90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3ca0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3cb0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
3cc0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
3cd0: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
3ce0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
3cf0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
3d00: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
3d10: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
3d20: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3d30: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
3d40: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3d50: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3d60: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3d70: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
3d80: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3d90: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
3da0: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
3db0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
3dc0: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
3dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3e10: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
3e20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3e30: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
3e40: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
3e50: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
3e60: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
3e70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3e80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3e90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3ea0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
3eb0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
3ec0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
3ed0: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
3ee0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3ef0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3f00: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3f10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3f20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3f30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3f40: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
3f50: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
3f60: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
3f70: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
3f80: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3f90: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3fa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3fb0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3fc0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
3fd0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
3fe0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
3ff0: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
4000: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4010: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4020: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4030: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4040: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4050: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4060: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4070: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
4080: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
4090: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
40a0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
40b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
40c0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
40d0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
40e0: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
40f0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
4100: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
4110: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
4120: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
4130: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4160: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4170: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
4180: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
4190: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
41a0: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
41b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
41c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
41d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
41e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
41f0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
4200: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4210: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4220: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
4230: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4240: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4250: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4260: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4280: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4290: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
42a0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
42b0: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
42c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
42d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
42e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
42f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4300: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4310: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
4320: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
4330: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
4340: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
4350: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4360: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4370: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
4380: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
43a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
43b0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
43c0: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
43d0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
43e0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
43f0: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
4400: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
4410: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4420: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
4430: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4440: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4450: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4460: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4470: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
4480: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
4490: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
44a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
44b0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
44c0: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
44d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
44f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4500: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
4510: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
4520: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
4530: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
4540: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
4550: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
4560: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
4570: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
4580: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4590: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
45a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
45b0: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
45c0: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
45d0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
45e0: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
45f0: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4600: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
4610: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
4620: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4630: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
4640: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
4650: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
4660: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
4670: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
4680: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
4690: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
46a0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
46b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
46c0: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
46d0: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
46e0: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
46f0: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
4700: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
4710: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
4720: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
4730: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
4740: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
4750: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
4760: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
4770: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
4780: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
4790: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
47a0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
47b0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
47e0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
47f0: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
4800: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
4810: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
4820: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4830: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
4840: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4850: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
4860: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
4870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4880: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
4890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
48a0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
48b0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
48c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
48f0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
4900: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
4910: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
4920: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
4930: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
4940: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
4950: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4960: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
4970: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
4980: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
4990: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
49a0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
49b0: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
49c0: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
49d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
49e0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
49f0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
4a00: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
4a10: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
4a20: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
4a30: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
4a40: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4a50: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4a80: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
4a90: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
4aa0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
4ab0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
4ac0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4ad0: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
4ae0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4af0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4b00: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
4b10: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
4b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4b30: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
4b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4b50: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
4b60: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
4b70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ba0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
4bb0: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
4bc0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4bd0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
4be0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4bf0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4c00: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4c10: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4c20: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
4c30: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
4c40: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
4c50: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
4c60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4c70: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4c80: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4c90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4cc0: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
4cd0: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
4ce0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
4cf0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4d20: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
4d30: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
4d40: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
4d50: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
4d60: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4d70: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4d90: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4db0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4dc0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
4dd0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
4de0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
4df0: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
4e00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4e10: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4e20: 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73  SI).  { "GetVers
4e30: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
4e40: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
4e50: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
4e60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4e70: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4e80: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4e90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4ec0: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
4ed0: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
4ee0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
4ef0: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
4f00: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
4f10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4f20: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20  HeapAlloc",     
4f30: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f40: 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20  LL)HeapAlloc,   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
4f70: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
4f80: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
4f90: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4fa0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
4fb0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
4fc0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4fd0: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72  INRT.  { "HeapCr
4fe0: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
4ff0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5000: 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  pCreate,        
5010: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5020: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
5030: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5040: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5070: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65  define osHeapCre
5080: 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ate ((HANDLE(WIN
5090: 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45  API*)(DWORD,SIZE
50a0: 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  _T, \.        SI
50b0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
50c0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
50d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
50e0: 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  RT.  { "HeapDest
50f0: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
5100: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44    (SYSCALL)HeapD
5110: 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20  estroy,         
5120: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5130: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
5140: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
5150: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5180: 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72  fine osHeapDestr
5190: 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  oy ((BOOL(WINAPI
51a0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
51b0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
51c0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65  )..  { "HeapFree
51d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
51e0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46    (SYSCALL)HeapF
51f0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
5200: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5210: 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42  e osHeapFree ((B
5220: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5230: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
5240: 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70  ))aSyscall[38].p
5250: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
5260: 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20  eapReAlloc",    
5270: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5280: 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20  L)HeapReAlloc,  
5290: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
52a0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52  .#define osHeapR
52b0: 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  eAlloc ((LPVOID(
52c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
52d0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a  DWORD,LPVOID, \.
52e0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
52f0: 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75  aSyscall[39].pCu
5300: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
5310: 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  pSize",         
5320: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5330: 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20  HeapSize,       
5340: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5350: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a  define osHeapSiz
5360: 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50  e ((SIZE_T(WINAP
5370: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5380: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
5390: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  OID))aSyscall[40
53a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
53b0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
53c0: 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  T.  { "HeapValid
53d0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
53e0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61   (SYSCALL)HeapVa
53f0: 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  lidate,         
5400: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5410: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
5420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5430: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5450: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5460: 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61  ine osHeapValida
5470: 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  te ((BOOL(WINAPI
5480: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5490: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
54a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d  ID))aSyscall[41]
54b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
54c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
54d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
54e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
54f0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5500: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
5510: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
5520: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5530: 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20  oadLibraryA,    
5540: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5550: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
5560: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
5570: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
55a0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
55b0: 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c  ibraryA ((HMODUL
55c0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
55d0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e  R))aSyscall[42].
55e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
55f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5600: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5610: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5620: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21  ) && \.        !
5630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5640: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
5650: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
5660: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
5670: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
5680: 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20  LibraryW,       
5690: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
56a0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
56b0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
56c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
56f0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
5700: 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryW ((HMODULE(W
5710: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
5720: 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43  )aSyscall[43].pC
5730: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5740: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5750: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5770: 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c  SCALL)LocalFree,
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5790: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
57a0: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
57b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
57c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
57d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
57e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
57f0: 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c  osLocalFree ((HL
5800: 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c  OCAL(WINAPI*)(HL
5810: 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34  OCAL))aSyscall[4
5820: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5830: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5840: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
5850: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b  _WINRT.  { "Lock
5860: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5870: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5880: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
5890: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
58a0: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
58b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
58c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
58f0: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
5900: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  ile.#define osLo
5910: 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  ckFile ((BOOL(WI
5920: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5930: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5940: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5950: 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70  ))aSyscall[45].p
5960: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
5970: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5980: 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46  WINCE.  { "LockF
5990: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
59a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
59b0: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
59c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
59d0: 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  e.  { "LockFileE
59e0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
59f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5a20: 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69  #ifndef osLockFi
5a30: 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c  leEx.#define osL
5a40: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
5a50: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5a60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5a70: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
5a80: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
5a90: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
5aa0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
5ab0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
5ac0: 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45  INCE || (!SQLITE
5ad0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
5ae0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5af0: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70  T_WAL)).  { "Map
5b00: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
5b10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5b20: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  MapViewOfFile,  
5b30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b40: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
5b50: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
5b60: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b90: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
5ba0: 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f  iewOfFile ((LPVO
5bb0: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
5bc0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
5bd0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5be0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
5bf0: 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [47].pCurrent)..
5c00: 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f    { "MultiByteTo
5c10: 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20 28  WideChar",     (
5c20: 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74  SYSCALL)MultiByt
5c30: 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20  eToWideChar,    
5c40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5c50: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
5c60: 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50  Char ((int(WINAP
5c70: 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c  I*)(UINT,DWORD,L
5c80: 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52  PCSTR,int,LPWSTR
5c90: 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29  , \.        int)
5ca0: 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43  )aSyscall[48].pC
5cb0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75  urrent)..  { "Qu
5cc0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
5cd0: 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c  unter", (SYSCALL
5ce0: 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  )QueryPerformanc
5cf0: 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a  eCounter, 0 },..
5d00: 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50  #define osQueryP
5d10: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
5d20: 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  r ((BOOL(WINAPI*
5d30: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52  )( \.        LAR
5d40: 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79  GE_INTEGER*))aSy
5d50: 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65  scall[49].pCurre
5d60: 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69  nt)..  { "ReadFi
5d70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
5d80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61      (SYSCALL)Rea
5d90: 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  dFile,          
5da0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5db0: 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28  ine osReadFile (
5dc0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
5dd0: 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f  ANDLE,LPVOID,DWO
5de0: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
5df0: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
5e00: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d  ED))aSyscall[50]
5e10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5e20: 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20  "SetEndOfFile", 
5e30: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e40: 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65  ALL)SetEndOfFile
5e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5e60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  ,..#define osSet
5e70: 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  EndOfFile ((BOOL
5e80: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5e90: 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70  ))aSyscall[51].p
5ea0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5eb0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5ec0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
5ed0: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
5ee0: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
5ef0: 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  inter,          
5f00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5f10: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
5f20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5f30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5f50: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5f60: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
5f70: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
5f80: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50  *)(HANDLE,LONG,P
5f90: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20  LONG, \.        
5fa0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
5fb0: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  52].pCurrent)..#
5fc0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5fd0: 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  NRT.  { "Sleep",
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65     (SYSCALL)Slee
6000: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6010: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6020: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6040: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6070: 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28  efine osSleep ((
6080: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57  VOID(WINAPI*)(DW
6090: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33  ORD))aSyscall[53
60a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
60b0: 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69   "SystemTimeToFi
60c0: 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  leTime",    (SYS
60d0: 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54  CALL)SystemTimeT
60e0: 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20  oFileTime,    0 
60f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79  },..#define osSy
6100: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
6110: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
6120: 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54  *)(CONST SYSTEMT
6130: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
6140: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
6150: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
6160: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6170: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
6180: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6190: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
61b0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c  CALL)UnlockFile,
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
61d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
61e0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
61f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6200: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6210: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6220: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
6230: 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66  sUnlockFile.#def
6240: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
6250: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6260: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6270: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6280: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
6290: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
62a0: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  t).#endif..#if !
62b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
62c0: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
62d0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
62e0: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
62f0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
6300: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6310: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
6320: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6330: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6350: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6360: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  e osUnlockFileEx
6370: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6380: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6390: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
63a0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
63b0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  D))aSyscall[56].
63c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
63d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
63e0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
63f0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
6400: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
6410: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
6420: 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46  ALL)UnmapViewOfF
6430: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ile,         0 }
6440: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d  ,.#else.  { "Unm
6450: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
6460: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6470: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6480: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6490: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
64a0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20  UnmapViewOfFile 
64b0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
64c0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
64d0: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[57].pCurrent).
64e0: 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f  .  { "WideCharTo
64f0: 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20  MultiByte",     
6500: 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61  (SYSCALL)WideCha
6510: 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20  rToMultiByte,   
6520: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6530: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
6540: 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41  iByte ((int(WINA
6550: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
6560: 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54  LPCWSTR,int,LPST
6570: 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20  R,int, \.       
6580: 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29   LPCSTR,LPBOOL))
6590: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75  aSyscall[58].pCu
65a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69  rrent)..  { "Wri
65b0: 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  teFile",        
65c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
65d0: 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20  WriteFile,      
65e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
65f0: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69  define osWriteFi
6600: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6610: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49  *)(HANDLE,LPCVOI
6620: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
6630: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6640: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6650: 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[59].pCurrent).
6660: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6670: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
6680: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
6690: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
66a0: 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20  ateEventExW,    
66b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
66c0: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
66d0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
66e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6710: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45  define osCreateE
6720: 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45  ventExW ((HANDLE
6730: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55  (WINAPI*)(LPSECU
6740: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
6750: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
6760: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29     DWORD,DWORD))
6770: 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75  aSyscall[60].pCu
6780: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6790: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
67a0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
67b0: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
67c0: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
67d0: 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20  leObject,     0 
67e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
67f0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6800: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
6810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6840: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
6850: 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ject ((DWORD(WIN
6860: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
6870: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6880: 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72  Syscall[61].pCur
6890: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
68a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
68b0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
68c0: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
68d0: 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  LL)WaitForSingle
68e0: 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c  ObjectEx,   0 },
68f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74  .#else.  { "Wait
6900: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
6910: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30  x",   (SYSCALL)0
6920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6930: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6940: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57  dif..#define osW
6950: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6960: 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e  ctEx ((DWORD(WIN
6970: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6980: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f  RD, \.        BO
6990: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  OL))aSyscall[62]
69a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
69b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
69c0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
69d0: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
69e0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
69f0: 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20  ointerEx,       
6a00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6a10: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
6a20: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
6a30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6a60: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
6a70: 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  erEx ((BOOL(WINA
6a80: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47  PI*)(HANDLE,LARG
6a90: 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20  E_INTEGER, \.   
6aa0: 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45       PLARGE_INTE
6ab0: 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63  GER,DWORD))aSysc
6ac0: 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74  all[63].pCurrent
6ad0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6ae0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
6af0: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
6b00: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
6b10: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
6b20: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
6b30: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
6b40: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
6b50: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
6b60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6b80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b90: 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  ne osGetFileInfo
6ba0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6bd0: 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59      FILE_INFO_BY
6be0: 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50  _HANDLE_CLASS,LP
6bf0: 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73  VOID,DWORD))aSys
6c00: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
6c10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6c20: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
6c30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6c40: 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  WAL).  { "MapVie
6c50: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
6c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
6c70: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
6c80: 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  p,    0 },.#else
6c90: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6ca0: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
6cb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6ce0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
6cf0: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28  OfFileFromApp ((
6d00: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6d10: 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f  HANDLE,ULONG,ULO
6d20: 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20  NG64, \.        
6d30: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6d40: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
6d50: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6d60: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NRT.  { "CreateF
6d70: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
6d80: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
6d90: 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20  teFile2,        
6da0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6db0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
6dc0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6dd0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6e00: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
6e10: 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  le2 ((HANDLE(WIN
6e20: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
6e30: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6e40: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45   \.        LPCRE
6e50: 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
6e60: 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53  D_PARAMETERS))aS
6e70: 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72  yscall[66].pCurr
6e80: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6e90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
6ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6eb0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
6ec0: 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  ).  { "LoadPacka
6ed0: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
6ee0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61   (SYSCALL)LoadPa
6ef0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20  ckagedLibrary,  
6f00: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6f10: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6f20: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6f30: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6f50: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6f60: 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  ine osLoadPackag
6f70: 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44  edLibrary ((HMOD
6f80: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
6f90: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6fa0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6fb0: 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  67].pCurrent)..#
6fc0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6fd0: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
6fe0: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
6ff0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
7000: 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20  ckCount64,      
7010: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7020: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
7030: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
7040: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7070: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
7080: 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e  unt64 ((ULONGLON
7090: 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  G(WINAPI*)(VOID)
70a0: 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43  )aSyscall[68].pC
70b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
70c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
70d0: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
70e0: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
70f0: 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79  CALL)GetNativeSy
7100: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20  stemInfo,     0 
7110: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
7120: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
7130: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
7140: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7150: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7160: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7170: 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
7180: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
7190: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
71a0: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
71b0: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
71c0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
71d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
71e0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f  HAS_ANSI).  { "O
71f0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7200: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
7210: 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  L)OutputDebugStr
7220: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
7230: 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75  #else.  { "Outpu
7240: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
7250: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7280: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75  if..#define osOu
7290: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
72a0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
72b0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
72c0: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
72d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
72e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
72f0: 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  DE).  { "OutputD
7300: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
7310: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
7320: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20  utDebugStringW, 
7330: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7340: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7350: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
7360: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7390: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
73a0: 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49  bugStringW ((VOI
73b0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
73c0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d  TR))aSyscall[71]
73d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
73e0: 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22  "GetProcessHeap"
73f0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7400: 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65  ALL)GetProcessHe
7410: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
7420: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
7430: 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41  ProcessHeap ((HA
7440: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f  NDLE(WINAPI*)(VO
7450: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d  ID))aSyscall[72]
7460: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
7480: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7490: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
74a0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
74b0: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
74c0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
74d0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20  MappingFromApp, 
74e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
74f0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
7500: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
7510: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7520: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7530: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7540: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
7550: 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41  pingFromApp ((HA
7560: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
7570: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
7580: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
7590: 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  BUTES,ULONG,ULON
75a0: 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79  G64,LPCWSTR))aSy
75b0: 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65  scall[73].pCurre
75c0: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
75d0: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
75e0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
75f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
7600: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
7610: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
7620: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
7630: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
7640: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
7650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
7660: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
7670: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
7680: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
7690: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
76a0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
76b0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
76c0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
76d0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
76e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
76f0: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
7700: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
7710: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
7720: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
7730: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
7740: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7750: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
7760: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
7770: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
7780: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
7790: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
77a0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
77b0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
77c0: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
77d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
77e0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
77f0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
7800: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
7810: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
7820: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
7830: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
7840: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
7850: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
7860: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
7870: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
7880: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
7890: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
78a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
78b0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
78c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
78d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
78e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
78f0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
7900: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
7910: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
7920: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
7930: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
7940: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
7950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
7960: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
7970: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
7980: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
7990: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
79a0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
79c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
79d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
79e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
79f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
7a00: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
7a10: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
7a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
7a30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
7a40: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
7a50: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7a60: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
7a70: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7a80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7a90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7aa0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
7ab0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
7ac0: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
7ad0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
7ae0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
7af0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
7b00: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
7b10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7b20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7b30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7b40: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
7b50: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
7b60: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
7b70: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
7b80: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
7b90: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
7ba0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
7bb0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
7bc0: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
7bd0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
7be0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
7bf0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
7c00: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
7c10: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
7c20: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
7c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7c40: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
7c50: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
7c60: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
7c70: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
7c80: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
7c90: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
7ca0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
7cb0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7cc0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7cd0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
7ce0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
7cf0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
7d00: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7d10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7d20: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
7d30: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
7d40: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
7d50: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
7d60: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
7d70: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
7d80: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
7d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
7da0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
7db0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
7dc0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
7dd0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
7de0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
7df0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
7e00: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
7e10: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
7e20: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
7e30: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
7e40: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
7e50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7e60: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
7e70: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
7e80: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
7e90: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
7ea0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
7eb0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
7ec0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
7ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ee0: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
7ef0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
7f00: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
7f10: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
7f20: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
7f30: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
7f40: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
7f50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
7f60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74  his function out
7f70: 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69  puts the specifi
7f80: 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67  ed (ANSI) string
7f90: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65   to the Win32 de
7fa0: 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76  bugger.** (if av
7fb0: 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f  ailable)..*/..vo
7fc0: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
7fd0: 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e  _write_debug(con
7fe0: 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69  st char *zBuf, i
7ff0: 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72  nt nBuf){.  char
8000: 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f   zDbgBuf[SQLITE_
8010: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8020: 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20  ZE];.  int nMin 
8030: 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c  = MIN(nBuf, (SQL
8040: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
8050: 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a  F_SIZE - 1)); /*
8060: 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65   may be negative
8070: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c  . */.  if( nMin<
8080: 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20  -1 ) nMin = -1; 
8090: 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20  /* all negative 
80a0: 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31  values become -1
80b0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
80c0: 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d  Min==-1 || nMin=
80d0: 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54  =0 || nMin<SQLIT
80e0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
80f0: 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69  SIZE );.#if defi
8100: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8110: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28  _HAS_ANSI).  if(
8120: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
8130: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
8140: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
8150: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
8160: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
8170: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
8180: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
8190: 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29  StringA(zDbgBuf)
81a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
81b0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
81c0: 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  ngA(zBuf);.  }.#
81d0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
81e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
81f0: 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62  DE).  memset(zDb
8200: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
8210: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8220: 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75  ZE);.  if ( osMu
8230: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
8240: 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41  r(.          osA
8250: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
8260: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
8270: 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20  EMCP, 0, zBuf,. 
8280: 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28           nMin, (
8290: 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20  LPWSTR)zDbgBuf, 
82a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
82b0: 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66  _BUF_SIZE/sizeof
82c0: 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20  (WCHAR))<=0 ){. 
82d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
82e0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
82f0: 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a  ringW((LPCWSTR)z
8300: 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  DbgBuf);.#else. 
8310: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
8320: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
8330: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
8340: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
8350: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
8360: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
8370: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
8380: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62  tderr, "%s", zDb
8390: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
83a0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
83b0: 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  rr, "%s", zBuf);
83c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
83d0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
83e0: 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65  ng routine suspe
83f0: 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  nds the current 
8400: 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65  thread for at le
8410: 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73  ast ms.** millis
8420: 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73  econds.  This is
8430: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
8440: 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29  he Win32 Sleep()
8450: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
8460: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8470: 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45  RT.static HANDLE
8480: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
8490: 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73  ;.#endif..void s
84a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
84b0: 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65  ep(DWORD millise
84c0: 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49  conds){.#if SQLI
84d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
84e0: 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c   ( sleepObj==NUL
84f0: 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62  L ){.    sleepOb
8500: 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e  j = osCreateEven
8510: 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  tExW(NULL, NULL,
8520: 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41   CREATE_EVENT_MA
8530: 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20  NUAL_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 20 20 20 20 20 53 59 4e 43              SYNC
8560: 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  HRONIZE);.  }.  
8570: 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a  assert( sleepObj
8580: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61  !=NULL );.  osWa
8590: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
85a0: 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69  tEx(sleepObj, mi
85b0: 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53  lliseconds, FALS
85c0: 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c  E);.#else.  osSl
85d0: 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  eep(milliseconds
85e0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
85f0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
8600: 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20  non-zero) if we 
8610: 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65  are running unde
8620: 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20  r WinNT, Win2K, 
8630: 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e  WinXP,.** or Win
8640: 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  CE.  Return fals
8650: 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e  e (zero) for Win
8660: 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69  95, Win98, or Wi
8670: 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20  nME..**.** Here 
8680: 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e  is an interestin
8690: 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20  g observation:  
86a0: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e  Win95, Win98, an
86b0: 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20  d WinME lack.** 
86c0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
86d0: 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61   API.  But we ca
86e0: 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c  n still statical
86f0: 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20  ly link against 
8700: 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c  that.** API as l
8710: 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20  ong as we don't 
8720: 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e  call it when run
8730: 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45  ning Win95/98/ME
8740: 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  .  A call to.** 
8750: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8760: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
8770: 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73  e if the host is
8780: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a   Win95/98/ME or.
8790: 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  ** WinNT/2K/XP s
87a0: 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b  o that we will k
87b0: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
87c0: 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79  ot we can safely
87d0: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63   call.** the Loc
87e0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a  kFileEx() API..*
87f0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
8800: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
8810: 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65 66 69 6e  OS_WINRT.# defin
8820: 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65  e isNT()  (1).#e
8830: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  lif !defined(SQL
8840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
8850: 44 45 29 0a 23 20 64 65 66 69 6e 65 20 69 73 4e  DE).# define isN
8860: 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 20  T()  (0).#else. 
8870: 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54   static int isNT
8880: 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20  (void){.    if( 
8890: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
88a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45  =0 ){.      OSVE
88b0: 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f  RSIONINFOA sInfo
88c0: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
88d0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
88e0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
88f0: 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65  );.      osGetVe
8900: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
8910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8920: 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e  os_type = sInfo.
8930: 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45  dwPlatformId==VE
8940: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
8950: 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20  _NT ? 2 : 1;.   
8960: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71   }.    return sq
8970: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32  lite3_os_type==2
8980: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
8990: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
89a0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
89b0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
89c0: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
89d0: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
89e0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
89f0: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
8a00: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
8a10: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
8a20: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
8a30: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
8a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8a50: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
8a60: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
8a70: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
8a80: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8a90: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
8aa0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
8ab0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
8ac0: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
8ad0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
8ae0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8af0: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
8b00: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
8b10: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
8b20: 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f    p = osHeapAllo
8b30: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
8b40: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8b50: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
8b60: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
8b70: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
8b80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
8b90: 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f  iled to HeapAllo
8ba0: 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c  c %u bytes (%d),
8bb0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
8bd0: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
8be0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
8bf0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
8c00: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
8c10: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
8c20: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
8c30: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
8c40: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
8c50: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
8c60: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8c70: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8c80: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8c90: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8ca0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8cb0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8cc0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8cd0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8ce0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8cf0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8d00: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
8d10: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
8d20: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8d30: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
8d40: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
8d50: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
8d60: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
8d70: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
8d80: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
8d90: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
8da0: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
8db0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8dc0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
8dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
8de0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
8df0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
8e00: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ee block %p (%d)
8e10: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
8e30: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
8e40: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
8e50: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
8e60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
8e70: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
8e80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8e90: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
8ea0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
8eb0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
8ec0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
8ed0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
8ee0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
8ef0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
8f00: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
8f10: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
8f20: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
8f30: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8f40: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
8f50: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
8f60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8f70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8f80: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
8f90: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20  IDATE).  assert 
8fa0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
8fb0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
8fc0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
8fd0: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
8fe0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
8ff0: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  tes>=0 );.  if( 
9000: 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  !pPrior ){.    p
9010: 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68   = osHeapAlloc(h
9020: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9030: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28  32_HEAP_FLAGS, (
9040: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
9050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
9060: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68   osHeapReAlloc(h
9070: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9080: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
9090: 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e  Prior, (SIZE_T)n
90a0: 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Bytes);.  }.  if
90b0: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
90c0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
90d0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
90e0: 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25 64   %s %u bytes (%d
90f0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
9110: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
9120: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
9130: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
9140: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
9160: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
9170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
9180: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9190: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
91a0: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
91b0: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
91c0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
91d0: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
91e0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
91f0: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
9200: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
9210: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
9220: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
9230: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9240: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
9250: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
9260: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
9270: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9280: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
9290: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
92a0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
92b0: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
92c0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
92d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
92e0: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
92f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20 29  endif.  if( !p )
9300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
9310: 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61   osHeapSize(hHea
9320: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9330: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a  HEAP_FLAGS, p);.
9340: 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54    if( n==(SIZE_T
9350: 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  )-1 ){.    sqlit
9360: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
9370: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
9380: 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25  HeapSize block %
9390: 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  p (%d), heap=%p"
93a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
93b0: 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72    p, osGetLastEr
93c0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
93d0: 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eap);.    return
93e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
93f0: 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   (int)n;.}../*.*
9400: 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71  * Round up a req
9410: 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65  uest size to the
9420: 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f   next valid allo
9430: 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  cation size..*/.
9440: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
9450: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b  mRoundup(int n){
9460: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
9470: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
9480: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
9490: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
94a0: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
94b0: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
94c0: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
94d0: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
94e0: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
94f0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
9500: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9510: 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28  ERROR;.  assert(
9520: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
9530: 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  gic==WINMEM_MAGI
9540: 43 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54  C );..#if !SQLIT
9550: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51  E_OS_WINRT && SQ
9560: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9570: 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57  CREATE.  if( !pW
9580: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9590: 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44   ){.    pWinMemD
95a0: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
95b0: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
95c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
95d0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
9600: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
9610: 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIZE,.          
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 20 20 20 20 20 53 51 4c 49              SQLI
9640: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
9650: 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28  X_SIZE);.    if(
9660: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
9670: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
9680: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9690: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
96a0: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
96b0: 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c  pCreate (%d), fl
96c0: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
96d0: 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22  =%u, maxSize=%u"
96e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  ,.          osGe
96f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51  tLastError(), SQ
9700: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9710: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
9720: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9730: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51  AP_INIT_SIZE, SQ
9740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9750: 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  MAX_SIZE);.     
9760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9770: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
9780: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
9790: 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ned = TRUE;.    
97a0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
97b0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20  ata->bOwned );. 
97c0: 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d   }.#else.  pWinM
97d0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
97e0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
97f0: 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ();.  if( !pWinM
9800: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
9810: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
9820: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
9830: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
9840: 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  o GetProcessHeap
9850: 20 28 25 64 29 22 2c 20 6f 73 47 65 74 4c 61 73   (%d)", osGetLas
9860: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72  tError());.    r
9870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9880: 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  EM;.  }.  pWinMe
9890: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
98a0: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
98b0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
98c0: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
98d0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
98e0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
98f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
9900: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
9910: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
9920: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
9930: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9940: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9950: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
9960: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
9970: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
9980: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9990: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
99a0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
99b0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
99c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
99d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
99e0: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
99f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
9a00: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
9a10: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
9a20: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
9a30: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
9a40: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
9a50: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
9a60: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
9a70: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d  urn;.  if( pWinM
9a80: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
9a90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
9aa0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
9ab0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
9ac0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
9ad0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9ae0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9af0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
9b00: 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72  IDATE).    asser
9b10: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
9b20: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
9b30: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9b40: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
9b50: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
9b60: 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61     if( pWinMemDa
9b70: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20  ta->bOwned ){.  
9b80: 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44      if( !osHeapD
9b90: 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61  estroy(pWinMemDa
9ba0: 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20  ta->hHeap) ){.  
9bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
9bc0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
9bd0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44  "failed to HeapD
9be0: 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68 65 61  estroy (%d), hea
9bf0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
9c00: 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
9c10: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
9c20: 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d  id*)pWinMemData-
9c30: 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d  >hHeap);.      }
9c40: 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  .      pWinMemDa
9c50: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
9c60: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  SE;.    }.    pW
9c70: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9c80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
9c90: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
9ca0: 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  he low-level mem
9cb0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
9cc0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  unction pointers
9cd0: 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c   in.** sqlite3Gl
9ce0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74  obalConfig.m wit
9cf0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  h pointers to th
9d00: 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  e routines in th
9d10: 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  is file. The.** 
9d20: 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66  arguments specif
9d30: 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  y the block of m
9d40: 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e  emory to manage.
9d50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9d60: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
9d70: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
9d80: 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72  nfig(), and ther
9d90: 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  efore.** is not 
9da0: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74  required to be t
9db0: 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73  hreadsafe (it is
9dc0: 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   not)..*/.const 
9dd0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
9de0: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
9df0: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20  etWin32(void){. 
9e00: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
9e10: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
9e20: 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20  s winMemMethods 
9e30: 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61  = {.    winMemMa
9e40: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
9e50: 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Free,.    winMem
9e60: 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e  Realloc,.    win
9e70: 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e  MemSize,.    win
9e80: 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20  MemRoundup,.    
9e90: 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20  winMemInit,.    
9ea0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a  winMemShutdown,.
9eb0: 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74      &win_mem_dat
9ec0: 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  a.  };.  return 
9ed0: 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a  &winMemMethods;.
9ee0: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  }..void sqlite3M
9ef0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69  emSetDefault(voi
9f00: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  d){.  sqlite3_co
9f10: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
9f20: 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74  IG_MALLOC, sqlit
9f30: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29  e3MemGetWin32())
9f40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9f50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
9f60: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  C */../*.** Conv
9f70: 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69  ert a UTF-8 stri
9f80: 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20  ng to Microsoft 
9f90: 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f  Unicode (UTF-16?
9fa0: 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ). .**.** Space 
9fb0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
9fc0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
9fd0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
9fe0: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
9ff0: 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e 69 63  PWSTR utf8ToUnic
a000: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
a010: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
a020: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
a030: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
a040: 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  ..  nChar = osMu
a050: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
a060: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
a070: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
a080: 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68  L, 0);.  if( nCh
a090: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ar==0 ){.    ret
a0a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69  urn 0;.  }.  zWi
a0b0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
a0c0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
a0d0: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
a0e0: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
a0f0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
a100: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
a110: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a120: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
a130: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
a140: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
a150: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
a160: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a          nChar);.
a190: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
a1a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a1b0: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
a1c0: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
a1d0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
a1e0: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
a1f0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
a200: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
a210: 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   Unicode to UTF-
a220: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
a230: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
a240: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
a250: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
a260: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
a270: 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63  tatic char *unic
a280: 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54  odeToUtf8(LPCWST
a290: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
a2a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
a2b0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
a2c0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
a2d0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
a2e0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
a2f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
a300: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a310: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
a320: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a330: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
a340: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
a350: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
a360: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
a370: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a380: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
a390: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
a3a0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
a3b0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
a3c0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
a3d0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
a400: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
a410: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
a420: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
a430: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
a440: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a450: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
a460: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
a470: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
a480: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
a490: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
a4a0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
a4b0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
a4c0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
a4d0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a4e0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
a4f0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
a500: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
a510: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
a520: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e   LPWSTR mbcsToUn
a530: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
a540: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
a550: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
a560: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
a570: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
a580: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
a590: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
a5a0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
a5b0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
a5c0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
a5d0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
a5e0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -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 20 20 20 20 20                  
a610: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
a620: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
a630: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a640: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
a650: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
a660: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
a670: 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c  *sizeof(zMbcsFil
a680: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
a690: 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  f( zMbcsFilename
a6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a6b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
a6c0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
a6d0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
a6e0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
a6f0: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
a700: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66      nByte);.  if
a730: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
a740: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a750: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  MbcsFilename);. 
a760: 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65     zMbcsFilename
a770: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a780: 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  rn zMbcsFilename
a790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
a7a0: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
a7b0: 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79  code to multi-by
a7c0: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
a7d0: 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ing, based on th
a7e0: 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49  e.** user's ANSI
a7f0: 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   codepage..**.**
a800: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a810: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
a820: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
a830: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
a840: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
a850: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
a860: 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a  ToMbcs(LPCWSTR z
a870: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
a880: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
a890: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
a8a0: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
a8b0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
a8c0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
a8d0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
a8e0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
a8f0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
a900: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
a910: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
a920: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
a930: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
a940: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
a950: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
a960: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
a970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69  yte );.  if( zFi
a980: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
a990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a9a0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
a9b0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
a9c0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
a9d0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
a9e0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c            nByte,
aa10: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
aa20: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
aa30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
aa40: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
aa50: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
aa60: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
aa70: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
aa80: 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63  vert multibyte c
aa90: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
aaa0: 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
aab0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
aac0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
aad0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
aae0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
aaf0: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  )..*/.char *sqli
ab00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
ab10: 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61  o_utf8(const cha
ab20: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
ab30: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ab40: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Utf8;.  LPWSTR z
ab50: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
ab60: 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69  Wide = mbcsToUni
ab70: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
ab80: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
ab90: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
aba0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
abb0: 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64  ameUtf8 = unicod
abc0: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
abd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
abe0: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
abf0: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55  eturn zFilenameU
ac00: 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tf8;.}../*.** Co
ac10: 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d  nvert UTF-8 to m
ac20: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
ac30: 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63  er string.  Spac
ac40: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a  e to hold the .*
ac50: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
ac60: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ac70: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
ac80: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
ac90: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
aca0: 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63  _to_mbcs(const c
acb0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
acc0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
acd0: 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  meMbcs;.  LPWSTR
ace0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
acf0: 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55  mpWide = utf8ToU
ad00: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
ad10: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
ad20: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
ad30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
ad40: 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63  enameMbcs = unic
ad50: 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69  odeToMbcs(zTmpWi
ad60: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
ad70: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
ad80: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
ad90: 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMbcs;.}../*.** 
ada0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
adb0: 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ts the data dire
adc0: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d  ctory or the tem
add0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
ade0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
adf0: 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65   provided argume
ae00: 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61  nts.  The type a
ae10: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
ae20: 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  1 in order to se
ae30: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69  t the.** data di
ae40: 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20  rectory or 2 in 
ae50: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
ae60: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
ae70: 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75  tory.  The zValu
ae80: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  e.** argument is
ae90: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
aea0: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73   directory to us
aeb0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  e.  The return v
aec0: 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  alue will be.** 
aed0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aee0: 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20  cessful..*/.int 
aef0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
af00: 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52  t_directory(DWOR
af10: 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20  D type, LPCWSTR 
af20: 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20  zValue){.  char 
af30: 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20  **ppDirectory = 
af40: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
af50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
af60: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
af70: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
af80: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
af90: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
afa0: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
afb0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
afc0: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
afd0: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
afe0: 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
aff0: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65  rectory;.  }else
b000: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
b010: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
b020: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
b030: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
b040: 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   &sqlite3_temp_d
b050: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20  irectory;.  }.  
b060: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
b070: 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51  tory || type==SQ
b080: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
b090: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
b0a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65           || type
b0b0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
b0c0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
b0d0: 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  PE.  );.  assert
b0e0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
b0f0: 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  | sqlite3Memdebu
b100: 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65  gHasType(*ppDire
b110: 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48  ctory, MEMTYPE_H
b120: 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70  EAP) );.  if( pp
b130: 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
b140: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66   char *zValueUtf
b150: 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  8 = 0;.    if( z
b160: 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b  Value && zValue[
b170: 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c  0] ){.      zVal
b180: 75 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  ueUtf8 = unicode
b190: 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a  ToUtf8(zValue);.
b1a0: 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75        if ( zValu
b1b0: 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20  eUtf8==0 ){.    
b1c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b1d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
b1e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b1f0: 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63  e3_free(*ppDirec
b200: 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69  tory);.    *ppDi
b210: 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65  rectory = zValue
b220: 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e  Utf8;.    return
b230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
b240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b250: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
b260: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
b270: 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72   of getLastError
b280: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
b290: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
b2a0: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
b2b0: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
b2c0: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
b2d0: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
b2e0: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
b2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
b300: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
b310: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
b320: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
b330: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
b340: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
b350: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
b360: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
b370: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
b380: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
b390: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
b3a0: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
b3b0: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
b3c0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
b3d0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
b3e0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
b3f0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
b400: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
b410: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
b420: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
b430: 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58 5f 50   zTempWide[MAX_P
b440: 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a  ATH+1]; /* NOTE:
b450: 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69 74 72   Somewhat arbitr
b460: 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77 4c 65  ary. */.    dwLe
b470: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
b480: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
b490: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
b4a0: 7c 0a 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 20 20 20 20 20 46                 F
b4c0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
b4d0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_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 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
b500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
b520: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 20 20 20 20 30 2c 0a 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 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c        zTempWide,
b570: 0a 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 20 20 20 20 20 4d 41                MA
b590: 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20 20 20  X_PATH,.        
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20       0);.#else. 
b5c0: 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57     LPWSTR zTempW
b5d0: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
b5e0: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
b5f0: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
b600: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
b610: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
b640: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
b650: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b680: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_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 20 20 20 20 20 4e 55 4c               NUL
b6b0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 20 20 20 30 2c 0a 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 20 20 20 20 20 28 4c 50 57 53 54 52 29          (LPWSTR)
b720: 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20   &zTempWide,.   
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 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 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
b770: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c  ndif.    if( dwL
b780: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
b790: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
b7a0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
b7b0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
b7c0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
b7d0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
b7e0: 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
b7f0: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69  deToUtf8(zTempWi
b800: 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  de);.      sqlit
b810: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
b820: 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  c();.#if !SQLITE
b830: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
b840: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
b850: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
b860: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
b870: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
b880: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57  LocalFree(zTempW
b890: 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ide);.#endif.   
b8a0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
b8b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
b8c0: 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
b8d0: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
b8e0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
b8f0: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  osFormatMessageA
b900: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
b910: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
b920: 7c 0a 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 20 20 20 20 20 46                 F
b940: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
b950: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b980: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
b990: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 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 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
b9e0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a  (LPSTR) &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 20 20 20 20 20 30 2c 0a               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 20 20 20 20 20 30 29 3b               0);
ba70: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
ba80: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
ba90: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
baa0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
bab0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
bac0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
bad0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
bae0: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
baf0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
bb00: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  8(zTemp);.      
bb10: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
bb20: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
bb30: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
bb40: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
bb50: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
bb60: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
bb70: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
bb80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bb90: 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77  if.  if( 0 == dw
bba0: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
bbb0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
bbc0: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
bbd0: 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73   0x%x (%u)", las
bbe0: 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e  tErrno, lastErrn
bbf0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
bc00: 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d   /* copy a maxim
bc10: 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73  um of nBuf chars
bc20: 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65   to output buffe
bc30: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
bc40: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
bc50: 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74  zBuf, "%s", zOut
bc60: 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74  );.    /* free t
bc70: 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a  he UTF8 buffer *
bc80: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
bc90: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
bca0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
bcb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bcc0: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
bcd0: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
bce0: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
bcf0: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
bd00: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
bd10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
bd20: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
bd30: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
bd40: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
bd50: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
bd60: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
bd70: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
bd80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
bd90: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
bda0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
bdb0: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
bdc0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
bdd0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
bde0: 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  om .** FormatMes
bdf0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
be00: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
be10: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
be20: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
be30: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
be40: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
be50: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
be60: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
be70: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
be80: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
be90: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
bea0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
beb0: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
bec0: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
bed0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
bee0: 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  d and the associ
bef0: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
bf00: 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a   path, if any..*
bf10: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67  /.#define winLog
bf20: 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20  Error(a,b,c,d)  
bf30: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
bf40: 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e  ne(a,b,c,d,__LIN
bf50: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
bf60: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
bf70: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
bf80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bf90: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
bfa0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44  rror code */.  D
bfb0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bfd0: 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72  * Win32 last err
bfe0: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
bff0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
c000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
c010: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
c020: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
c030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
c040: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
c050: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
c060: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
c070: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
c080: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
c090: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
c0a0: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
c0b0: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
c0c0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
c0d0: 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20  zMsg[500];      
c0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75             /* Hu
c0f0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72  man readable err
c100: 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  or text */.  int
c110: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c130: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c140: 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a  .  zMsg[0] = 0;.
c150: 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73    getLastErrorMs
c160: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
c170: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
c180: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
c190: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
c1a0: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
c1b0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
c1c0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
c1d0: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
c1e0: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
c1f0: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
c200: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
c210: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
c220: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
c230: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
c240: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
c250: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
c260: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
c270: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
c280: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
c290: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
c2a0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
c2b0: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
c2c0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
c2d0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
c2e0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
c2f0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
c300: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
c310: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
c320: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
c330: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
c340: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
c350: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
c360: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
c370: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
c380: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
c390: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
c3a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
c3b0: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
c3c0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
c3d0: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
c3e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
c3f0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c400: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
c410: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
c420: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
c430: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
c440: 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f  atic int win32Io
c450: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
c460: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c470: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
c480: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
c490: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
c4a0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
c4b0: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  DELAY;../*.** If
c4c0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
c4d0: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
c4e0: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
c4f0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
c500: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
c510: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
c520: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
c530: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
c540: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
c550: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
c560: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
c570: 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74  t retryIoerr(int
c580: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
c590: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
c5a0: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
c5b0: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
c5c0: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f  pnRetry>=win32Io
c5d0: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
c5e0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
c5f0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
c600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
c610: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  n 0;.  }.  if( e
c620: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
c630: 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65  ENIED ||.      e
c640: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
c650: 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20  LATION ||.      
c660: 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  e==ERROR_SHARING
c670: 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20  _VIOLATION ){.  
c680: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
c690: 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  sleep(win32Ioerr
c6a0: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
c6b0: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
c6c0: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
c6d0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
c6e0: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
c6f0: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
c700: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c710: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
c720: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
c730: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
c740: 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74  oid logIoerr(int
c750: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20   nRetry){.  if( 
c760: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
c770: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c780: 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22  _IOERR, .      "
c790: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
c7a0: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
c7b0: 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77  nflict",.      w
c7c0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
c7d0: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
c7e0: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
c7f0: 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45   }.}..#if SQLITE
c800: 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a  _OS_WINCE./*****
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 2a  ****************
c850: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
c860: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
c870: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
c880: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
c890: 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  ed(SQLITE_MSVC_L
c8a0: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c  OCALTIME_API) ||
c8b0: 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f   !SQLITE_MSVC_LO
c8c0: 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a  CALTIME_API./*.*
c8d0: 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f  * The MSVC CRT o
c8e0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79  n Windows CE may
c8f0: 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
c900: 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
c910: 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20  .  So.** create 
c920: 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
c930: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
c940: 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f  h>.struct tm *__
c950: 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28  cdecl localtime(
c960: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29  const time_t *t)
c970: 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  .{.  static stru
c980: 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54  ct tm y;.  FILET
c990: 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20  IME uTm, lTm;.  
c9a0: 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a  SYSTEMTIME pTm;.
c9b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
c9c0: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
c9d0: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
c9e0: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
c9f0: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
ca00: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57  owDateTime = (DW
ca10: 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46  ORD)(t64 & 0xFFF
ca20: 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77  FFFFF);.  uTm.dw
ca30: 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44  HighDateTime= (D
ca40: 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29  WORD)(t64 >> 32)
ca50: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
ca60: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
ca70: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69  Tm,&lTm);.  osFi
ca80: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
ca90: 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20  me(&lTm,&pTm);. 
caa0: 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d   y.tm_year = pTm
cab0: 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20  .wYear - 1900;. 
cac0: 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e   y.tm_mon = pTm.
cad0: 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e  wMonth - 1;.  y.
cae0: 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_wday = pTm.wD
caf0: 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d  ayOfWeek;.  y.tm
cb00: 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _mday = pTm.wDay
cb10: 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20  ;.  y.tm_hour = 
cb20: 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74  pTm.wHour;.  y.t
cb30: 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e  m_min = pTm.wMin
cb40: 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20  ute;.  y.tm_sec 
cb50: 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20  = pTm.wSecond;. 
cb60: 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65   return &y;.}.#e
cb70: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41  ndif..#define HA
cb80: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
cb90: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
cba0: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
cbb0: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
cbc0: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
cbd0: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
cbe0: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
cc00: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
cc10: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
cc20: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
cc30: 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69     dwErr = osWai
cc40: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
cc50: 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  (h, INFINITE);. 
cc60: 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72    } while (dwErr
cc70: 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f   != WAIT_OBJECT_
cc80: 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41  0 && dwErr != WA
cc90: 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d  IT_ABANDONED);.}
cca0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
ccb0: 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62   lock acquired b
ccc0: 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  y winceMutexAcqu
ccd0: 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ire().*/.#define
cce0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
ccf0: 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74  se(h) ReleaseMut
cd00: 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ex(h)../*.** Cre
cd10: 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
cd20: 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  d shared memory 
cd30: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
cd40: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
cd50: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
cd60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
cd70: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
cd80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
cd90: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
cda0: 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20  File){.  LPWSTR 
cdb0: 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a  zTok;.  LPWSTR z
cdc0: 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61  Name;.  DWORD la
cdd0: 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20  stErrno;.  BOOL 
cde0: 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b  bLogged = FALSE;
cdf0: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
ce00: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
ce10: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
ce20: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
ce30: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
ce40: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
ce50: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
ce60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ce70: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
ce80: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
ce90: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
cea0: 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
ceb0: 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
cec0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
ced0: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
cee0: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
cef0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
cf00: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
cf10: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
cf20: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
cf30: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
cf40: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
cf50: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
cf60: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
cf70: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
cf80: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
cf90: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
cfa0: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
cfb0: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
cfc0: 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
cfd0: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
cfe0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
cff0: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
d000: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
d010: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
d020: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69  tError();.    wi
d030: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
d040: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
d050: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d060: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
d070: 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46  CreateLock1", zF
d080: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ilename);.    sq
d090: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
d0a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d0b0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
d0c0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
d0d0: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
d0e0: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
d0f0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
d100: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d110: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
d120: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
d130: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
d140: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
d150: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
d160: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
d170: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
d180: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
d190: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
d1a0: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
d1b0: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
d1c0: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
d1d0: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
d1e0: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
d1f0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
d200: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
d210: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
d220: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
d230: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, 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 20                  
d260: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
d270: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
d280: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
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 20 20 20                  
d2b0: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
d2c0: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
d2d0: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
d2e0: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
d2f0: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
d300: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
d310: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
d320: 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45  lized */.  lastE
d330: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
d340: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c  Error();.  if (l
d350: 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f  astErrno == ERRO
d360: 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53  R_ALREADY_EXISTS
d370: 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46  ){.    bInit = F
d380: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ALSE;.  }..  sql
d390: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
d3a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
d3b0: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
d3c0: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
d3d0: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
d3e0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  it. */.  if( pFi
d3f0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20  le->hShared ){. 
d400: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d410: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
d420: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
d430: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
d450: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
d460: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
d470: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d480: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
d490: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
d4a0: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
d4b0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
d4c0: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
d4d0: 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68    if( !pFile->sh
d4e0: 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46  ared ){.      pF
d4f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d500: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
d510: 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  );.      winLogE
d520: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
d530: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
d540: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d550: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
d560: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
d570: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
d580: 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
d590: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
d5a0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
d5b0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
d5c0: 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
d5d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d5e0: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
d5f0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
d600: 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
d610: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
d620: 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ail */.  if( pFi
d630: 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c  le->hShared==NUL
d640: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c  L ){.    if( !bL
d650: 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ogged ){.      p
d660: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d670: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
d680: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d690: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
d6a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
d6d0: 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k3", zFilename);
d6e0: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
d6f0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20   TRUE;.    }.   
d700: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
d710: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
d720: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
d730: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
d740: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
d750: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
d760: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d770: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20  _IOERR;.  }.  . 
d780: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
d790: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
d7a0: 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
d7b0: 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
d7c0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
d7d0: 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
d7e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
d7f0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
d800: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
d810: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d820: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d830: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
d840: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
d850: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
d860: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
d870: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
d880: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
d890: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
d8a0: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
d8b0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
d8c0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
d8d0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
d8e0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
d8f0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
d900: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
d910: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
d920: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
d930: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
d940: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
d950: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
d960: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
d970: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
d980: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
d990: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
d9a0: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
d9b0: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
d9c0: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
d9d0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d9e0: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
d9f0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
da00: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
da10: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
da20: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
da30: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
da40: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
da50: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
da60: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
da70: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
da80: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
da90: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
daa0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
dab0: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
dac0: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
dad0: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
dae0: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
daf0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
db00: 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
db10: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
db20: 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
db30: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
db40: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
db50: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
db60: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
db70: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
db80: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
db90: 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61    .    osCloseHa
dba0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
dbb0: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
dbc0: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
dbd0: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20   }.}../* .** An 
dbe0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
dbf0: 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
dc00: 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
dc10: 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
dc20: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
dc30: 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
dc40: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
dc50: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
dc60: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
dc70: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
dc80: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
dc90: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
dca0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
dcb0: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
dcc0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
dcd0: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
dce0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
dcf0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
dd00: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
dd10: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
dd20: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
dd30: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
dd40: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
dd50: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
dd60: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
dd70: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
dd80: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
dd90: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
dda0: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
ddb0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
ddc0: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
ddd0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
dde0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
ddf0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
de00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
de10: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
de20: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
de30: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
de40: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
de50: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
de60: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
de70: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
de80: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
de90: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
dea0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
deb0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
dec0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
ded0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
dee0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
def0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
df00: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
df10: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
df20: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
df30: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
df40: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
df50: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
df60: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
df70: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
df80: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
df90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
dfa0: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
dfb0: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
dfc0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
dfd0: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
dfe0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
dff0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
e000: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
e010: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e020: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
e030: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
e040: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
e050: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
e060: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
e070: 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
e080: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e090: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
e0a0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
e0b0: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
e0c0: 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
e0d0: 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
e0e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
e0f0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e100: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
e110: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
e120: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
e130: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e140: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
e150: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e160: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e170: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
e180: 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
e190: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
e1a0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
e1b0: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
e1c0: 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
e1d0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
e1e0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
e1f0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e200: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
e210: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
e220: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e230: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
e240: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e250: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
e260: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
e270: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e280: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
e290: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
e2a0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
e2b0: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
e2c0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
e2d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
e2e0: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
e2f0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
e300: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
e310: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
e320: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
e330: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
e340: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
e350: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
e360: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
e370: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e380: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
e390: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e3a0: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
e3b0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
e3c0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
e3d0: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
e3e0: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
e3f0: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
e400: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
e410: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
e420: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
e430: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
e440: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
e450: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
e460: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
e470: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
e480: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
e490: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
e4a0: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
e4b0: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
e4c0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
e4d0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
e4e0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e4f0: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
e500: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
e510: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
e520: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
e530: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
e540: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
e550: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
e560: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
e570: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
e580: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
e590: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
e5a0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
e5b0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e5c0: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
e5d0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
e5e0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
e5f0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
e600: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
e610: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
e620: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
e630: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
e640: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
e650: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e660: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e670: 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20  SHARED_SIZE.    
e680: 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d           || nNum
e690: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e6a0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
e6b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e6c0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
e6d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e6e0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
e6f0: 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
e700: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e710: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
e720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
e730: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
e740: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
e750: 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
e760: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
e770: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
e780: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
e790: 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
e7a0: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
e7b0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e7c0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
e7d0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
e7e0: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
e7f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
e800: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
e810: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e820: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
e830: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
e840: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e850: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
e860: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
e870: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
e880: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
e890: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
e8a0: 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
e8b0: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
e8c0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e8d0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
e8e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
e8f0: 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
e900: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e910: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
e920: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
e930: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
e940: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
e950: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
e960: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
e970: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
e980: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
e990: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
e9a0: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
e9b0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
e9c0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for 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 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
ea20: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
ea30: 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
ea40: 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
ea50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
ea60: 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
ea70: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
ea80: 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
ea90: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
eaa0: 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
eab0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
eac0: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
ead0: 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
eae0: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
eaf0: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
eb00: 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
eb10: 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
eb20: 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
eb30: 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
eb40: 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
eb50: 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
eb60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
eb70: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
eb80: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
eb90: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
ebc0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
ebd0: 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54  #else.  if( isNT
ebe0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
ebf0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
ec00: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
ec10: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
ec20: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
ec30: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
ec40: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
ec50: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
ec60: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
ec70: 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
ec80: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
ec90: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
eca0: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
ecb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
ecc0: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
ecd0: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
ece0: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
ecf0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
ed20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
ed30: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
ed40: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
ed50: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
ed60: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
ed70: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
ed80: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
ed90: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
eda0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
edb0: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
edc0: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
edd0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
ede0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
edf0: 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
ee00: 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
ee10: 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
ee20: 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
ee30: 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
ee40: 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
ee50: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
ee60: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
ee70: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
ee80: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
eeb0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
eec0: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
eed0: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f   isNT() ){.    O
eee0: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
eef0: 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
ef00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
ef10: 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
ef20: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
ef30: 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
ef40: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
ef50: 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
ef60: 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
ef70: 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e  Ex(*phFile, 0, n
ef80: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
ef90: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
efa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
efb0: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
efc0: 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
efd0: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
efe0: 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
f010: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
f020: 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f.}../**********
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 2a 2a  ****************
f070: 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
f080: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
f090: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
f0a0: 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
f0b0: 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
f0c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
f0d0: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
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 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
f130: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
f140: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
f150: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
f160: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
f170: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
f180: 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
f190: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
f1a0: 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
f1b0: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
f1c0: 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
f1d0: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
f1e0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
f1f0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
f200: 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  t .** argument t
f210: 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74  o offset iOffset
f220: 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65   within the file
f230: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
f240: 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f   return 0. .** O
f250: 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46  therwise, set pF
f260: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61  ile->lastErrno a
f270: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
f280: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
f290: 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69  t seekWinFile(wi
f2a0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  nFile *pFile, sq
f2b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
f2c0: 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  set){.#if !SQLIT
f2d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e  E_OS_WINRT.  LON
f2e0: 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20  G upperBits;    
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f300: 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74  Most sig. 32 bit
f310: 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20  s of new offset 
f320: 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  */.  LONG lowerB
f330: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
f340: 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69       /* Least si
f350: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
f360: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57  w offset */.  DW
f370: 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20  ORD dwRet;      
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f390: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
f3a0: 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  by SetFilePointe
f3b0: 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  r() */.  DWORD l
f3c0: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
f3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f3e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
f3f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
f400: 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  .  upperBits = (
f410: 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e  LONG)((iOffset>>
f420: 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
f430: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
f440: 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20   (LONG)(iOffset 
f450: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a  & 0xffffffff);..
f460: 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a    /* API oddity:
f470: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
f480: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
f490: 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64   returns a dword
f4a0: 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e   .  ** containin
f4b0: 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62  g the lower 32-b
f4c0: 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66  its of the new f
f4d0: 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20  ile-offset. Or, 
f4e0: 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a  if it fails,.  *
f4f0: 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56  * it returns INV
f500: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
f510: 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61  INTER. However a
f520: 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e  ccording to MSDN
f530: 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f  , .  ** INVALID_
f540: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f550: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76   may also be a v
f560: 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e  alid new offset.
f570: 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65   So to determine
f580: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61   .  ** whether a
f590: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
f5a0: 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
f5b0: 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
f5c0: 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a  ary to call .  *
f5d0: 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
f5e0: 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d  ..  */.  dwRet =
f5f0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
f600: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
f610: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
f620: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
f630: 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
f640: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
f650: 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26  POINTER.      &&
f660: 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
f670: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
f680: 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a  !=NO_ERROR)) ){.
f690: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f6a0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f6b0: 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
f6c0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
f6d0: 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
f6e0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f6f0: 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65      "seekWinFile
f700: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
f710: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
f720: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
f730: 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
f740: 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20   Same as above, 
f750: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73  except that this
f760: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f770: 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e  works for WinRT.
f780: 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49  .  */..  LARGE_I
f790: 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20  NTEGER x;       
f7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f7b0: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f7c0: 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20  BOOL bRet;      
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
f7f0: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
f800: 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e  terEx() */..  x.
f810: 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73  QuadPart = iOffs
f820: 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53  et;.  bRet = osS
f830: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
f840: 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20  pFile->h, x, 0, 
f850: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
f860: 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70  if(!bRet){.    p
f870: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f880: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f890: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
f8a0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f8b0: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
f8c0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f8d0: 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69        "seekWinFi
f8e0: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
f8f0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  h);.    return 1
f900: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f910: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20  0;.#endif.}../* 
f920: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
f930: 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
f940: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
f950: 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
f960: 46 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  File*);../*.** C
f970: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
f980: 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
f990: 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
f9a0: 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
f9b0: 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
f9c0: 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
f9d0: 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
f9e0: 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
f9f0: 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
fa00: 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
fa10: 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
fa20: 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
fa30: 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
fa40: 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
fa50: 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
fa60: 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
fa70: 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
fa80: 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
fa90: 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
faa0: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
fab0: 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
fac0: 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
fad0: 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
fae0: 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
faf0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
fb00: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
fb10: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
fb20: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
fb30: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
fb40: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
fb50: 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
fb60: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
fb70: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
fb80: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
fb90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fba0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
fbb0: 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
fbc0: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f 53  0 );.#endif.  OS
fbd0: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
fbe0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
fbf0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
fc00: 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
fc10: 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
fc20: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 0a  ANDLE_VALUE );..
fc30: 20 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61 70 66    rc = winUnmapf
fc40: 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ile(pFile);.  if
fc50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fc60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
fc70: 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
fc80: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
fc90: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
fca0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
fcb0: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
fcc0: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
fcd0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
fce0: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
fcf0: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
fd00: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
fd10: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
fd20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
fd30: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
fd40: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
fd50: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
fd60: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
fd70: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
fd80: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
fd90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
fda0: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
fdb0: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
fdc0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
fdd0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
fde0: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
fdf0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
fe00: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
fe10: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
fe20: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
fe30: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
fe40: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
fe50: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
fe60: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
fe70: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
fe80: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
fe90: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
fea0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
feb0: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
fec0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
fed0: 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
fee0: 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73  CE(("CLOSE %d %s
fef0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
ff00: 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
ff10: 65 64 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20  ed"));.  if( rc 
ff20: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
ff30: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
ff40: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
ff50: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
ff60: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
ff70: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
ff80: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
ff90: 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
ffa0: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
ffd0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
ffe0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
fff0: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
10000 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
10010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
10020 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
10030 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
10040 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
10050 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
10060 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
10070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10080 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
10090 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
100a0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
100b0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
100c0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
100d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
100e0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
100f0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
10100 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
10110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10120 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
10130 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
10140 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
10150 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
10160 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
10170 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
10180 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
10190 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
101a0 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
101b0 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
101c0 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
101d0 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
101e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
101f0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
10200 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
10210 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10230 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10240 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
10250 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
10260 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10280 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
10290 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
102a0 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
102b0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 53 69  t( amt>0 );.  Si
102c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
102d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
102e0 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
102f0 43 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE(("READ %d loc
10300 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
10310 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
10320 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
10330 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10340 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
10350 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
10360 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
10370 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
10380 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
10390 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
103a0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
103b0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
103c0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
103d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
103e0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
103f0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
10400 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
10410 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
10420 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
10430 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
10440 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
10450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10470 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
10480 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
10490 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
104a0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
104b0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
104c0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
104d0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
104e0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
104f0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
10500 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
10510 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
10520 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
10530 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
10540 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10550 45 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46  E.  if( seekWinF
10560 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
10570 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
10580 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
10590 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
105a0 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
105b0 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
105c0 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
105d0 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
105e0 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
105f0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
10600 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10610 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
10620 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
10630 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
10640 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
10650 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
10660 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
10670 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
10680 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
10690 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
106a0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
106b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
106c0 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
106d0 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
106e0 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
106f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
10700 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
10710 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
10720 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
10730 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10740 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
10750 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
10760 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10770 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65  OERR_READ, pFile
10780 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10790 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65            "winRe
107a0 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ad", pFile->zPat
107b0 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65  h);.  }.  logIoe
107c0 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66  rr(nRetry);.  if
107d0 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
107e0 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
107f0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
10800 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
10810 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
10820 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
10830 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
10840 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
10850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10860 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
10870 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  AD;.  }..  retur
10880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10890 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
108a0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
108b0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
108c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
108d0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
108e0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
108f0 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
10900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10910 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  inWrite(.  sqlit
10920 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
10930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10940 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
10950 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
10960 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
10970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
10980 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  es to be written
10990 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
109c0 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
109d0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
109e0 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
109f0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10a00 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74   into the file t
10a10 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
10a20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  at */.){.  int r
10a30 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
10a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
10a50 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20  ue if error has 
10a60 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66  occurred, else f
10a70 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  alse */.  winFil
10a80 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
10a90 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
10aa0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
10ab0 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ad0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69   Number of retri
10ae0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
10af0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
10b00 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
10b10 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
10b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10b30 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
10b40 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
10b50 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
10b60 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
10b70 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE(("WRITE %d lo
10b80 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
10b90 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
10ba0 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
10bb0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
10bc0 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
10bd0 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
10be0 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
10bf0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
10c00 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
10c10 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
10c20 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
10c30 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
10c40 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
10c50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
10c60 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
10c70 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
10c80 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
10c90 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
10ca0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
10cb0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
10cc0 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  f, amt);.      r
10cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10cf0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
10d00 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
10d10 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
10d20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
10d30 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
10d40 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
10d50 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
10d60 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
10d70 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
10d80 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
10d90 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
10da0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
10db0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
10dc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
10dd0 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b 57  NCE.  rc = seekW
10de0 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  inFile(pFile, of
10df0 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
10e00 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
10e10 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
10e20 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10e30 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
10e40 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
10e50 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
10e60 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
10e70 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
10e80 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
10e90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
10ea0 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
10eb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
10ec0 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
10ed0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10ee0 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
10ef0 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
10f00 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
10f30 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
10f40 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
10f50 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
10f60 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
10f70 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
10f80 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
10f90 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
10fa0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10fb0 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
10fc0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
10fd0 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
10fe0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10ff0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
11000 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
11010 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
11020 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
11030 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
11040 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
11050 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
11060 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
11070 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11080 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
11090 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
110a0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
110b0 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
110c0 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
110d0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
110e0 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
110f0 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
11100 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
11110 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
11120 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
11130 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
11140 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
11150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11160 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
11170 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
11180 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
11190 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
111a0 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
111b0 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
111c0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
111d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
111e0 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
111f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
11200 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11210 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
11220 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
11230 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
11240 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
11250 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
11260 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
11270 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
11280 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
11290 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
112a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
112b0 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
112c0 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
112d0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
112e0 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
112f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11300 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
11310 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
11320 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
11330 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
11340 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11350 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
11360 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
11370 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
11380 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
11390 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
113a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
113b0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
113c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
113d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
113e0 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
113f0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
11400 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
11410 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
11420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
11430 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
11440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11450 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11460 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
11470 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
11480 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
11490 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
114a0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
114b0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
114c0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
114d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
114e0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
114f0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
11500 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
11510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11530 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
11540 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
11550 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
11570 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  le );..  OSTRACE
11580 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
11590 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
115a0 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d  , nByte));.  Sim
115b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
115c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
115d0 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f  _TRUNCATE);..  /
115e0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
115f0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
11600 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
11610 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
11620 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
11630 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
11640 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
11650 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
11660 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
11670 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
11680 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
11690 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
116a0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
116b0 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
116c0 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
116d0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
116e0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
116f0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
11700 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
11710 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
11720 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
11730 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f   }..  /* SetEndO
11740 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20  fFile() returns 
11750 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75  non-zero when su
11760 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72  ccessful, or zer
11770 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e  o when it fails.
11780 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69   */.  if( seekWi
11790 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  nFile(pFile, nBy
117a0 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  te) ){.    rc = 
117b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
117c0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
117d0 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
117e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
117f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
11800 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d  uncate1", pFile-
11810 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
11820 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64   if( 0==osSetEnd
11830 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
11840 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
11850 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
11860 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
11870 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50  =ERROR_USER_MAPP
11880 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20  ED_FILE) ){.    
11890 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
118a0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
118b0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
118c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
118d0 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
118e0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
11910 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11920 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
11930 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
11940 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
11950 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
11960 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
11970 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
11980 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20  tly.  ** mapped 
11990 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74  region, reduce t
119a0 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70  he effective map
119b0 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c  ping size as wel
119c0 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20  l. SQLite will. 
119d0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
119e0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
119f0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
11a00 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
11a10 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20   now on..  */.  
11a20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
11a30 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70  egion && nByte<p
11a40 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
11a50 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  {.    pFile->mma
11a60 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
11a70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54   }.#endif..  OST
11a80 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
11a90 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
11aa0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
11ab0 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
11ac0 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
11ad0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
11ae0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
11af0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
11b00 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
11b10 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
11b20 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
11b30 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
11b40 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
11b50 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
11b60 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
11b70 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
11b80 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
11b90 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
11ba0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
11bb0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
11bc0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
11bd0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
11be0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
11bf0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
11c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11c10 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
11c20 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
11c30 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
11c40 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
11c50 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
11c60 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
11c70 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
11c80 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
11c90 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
11ca0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
11cb0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
11cc0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
11cd0 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
11ce0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
11cf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11d00 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a  EBUG)).  /*.  **
11d10 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
11d20 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
11d30 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
11d40 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
11d50 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
11d60 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
11d70 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11d80 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
11d90 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
11da0 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
11db0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11dc0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
11dd0 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
11de0 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
11df0 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
11e00 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
11e10 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
11e20 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
11e30 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
11e40 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
11e50 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
11e60 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
11e70 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  YNC %d lock=%d\n
11e80 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
11e90 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
11ea0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
11eb0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
11ec0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
11ed0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
11ee0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
11ef0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
11f00 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
11f10 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
11f20 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
11f30 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
11f40 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
11f50 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
11f60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
11f70 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
11f80 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
11f90 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
11fa0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
11fb0 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
11fc0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
11fd0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
11fe0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
11ff0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
12000 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
12010 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
12020 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
12030 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
12040 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
12050 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
12060 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72  _NO_SYNC.  retur
12070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
12080 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
12090 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
120a0 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
120b0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
120c0 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
120d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
120e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
120f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
12100 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
12110 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
12120 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
12130 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
12140 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
12150 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12160 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
12170 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12180 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12190 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
121a0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
121b0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
121c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
121d0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
121e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
121f0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
12200 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
12210 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
12220 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
12230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
12240 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
12250 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12260 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
12270 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69 66  OERR_FSTAT);.#if
12280 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
12290 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54  .  {.    FILE_ST
122a0 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f  ANDARD_INFO info
122b0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46  ;.    if( osGetF
122c0 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
122d0 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e  HandleEx(pFile->
122e0 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49  h, FileStandardI
122f0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
12320 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
12330 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
12340 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e   info.EndOfFile.
12350 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65  QuadPart;.    }e
12360 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
12370 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
12380 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
12390 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
123a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
123b0 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
123c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
123f0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
12400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
12410 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
12420 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44  upperBits;.    D
12430 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
12440 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
12450 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42  rno;..    lowerB
12460 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53  its = osGetFileS
12470 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
12480 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a  pperBits);.    *
12490 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
124a0 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
124b0 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
124c0 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20  Bits;.    if(   
124d0 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
124e0 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
124f0 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  .       && ((las
12500 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
12510 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
12520 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70  RROR) ){.      p
12530 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12540 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
12550 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
12560 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12570 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
12580 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
12590 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
125a0 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
125b0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
125c0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
125d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
125e0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
125f0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
12600 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
12610 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
12620 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
12630 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
12640 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
12650 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
12660 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
12670 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
12680 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
12690 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
126a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
126b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
126c0 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
126d0 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
126e0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
126f0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
12700 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
12710 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
12720 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
12730 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
12740 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
12750 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
12760 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
12770 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
12780 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
12790 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
127a0 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
127b0 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
127c0 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
127d0 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
127e0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
127f0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
12800 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
12810 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
12820 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
12830 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
12840 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
12850 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
12860 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
12870 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
12880 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
12890 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
128c0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
128d0 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
128e0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
128f0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
12900 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
12910 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
12920 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
12930 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
12940 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
12950 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
12960 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
12970 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
12980 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
12990 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
129a0 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
129b0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
129c0 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
129d0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
129e0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
129f0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
12a00 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
12a10 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
12a20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12a30 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
12a40 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
12a50 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
12a60 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
12a70 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
12a80 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
12a90 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
12aa0 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  NCE.    /*.    *
12ab0 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
12ac0 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
12ad0 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
12ae0 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
12af0 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20  he Win32.    ** 
12b00 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
12b10 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  leEx..    */.   
12b20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b   res = winceLock
12b30 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12b40 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
12b50 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20   1, 0);.#else.  
12b60 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
12b70 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
12b80 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
12b90 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46  _FLAGS, SHARED_F
12ba0 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20  IRST, 0,.       
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
12bc0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
12bd0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
12be0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
12bf0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
12c00 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20      int lk;.    
12c10 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
12c20 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26  ss(sizeof(lk), &
12c30 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lk);.    pFile->
12c40 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
12c50 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30   (short)((lk & 0
12c60 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
12c70 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20  ED_SIZE - 1));. 
12c80 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
12c90 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12ca0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
12cb0 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
12cd0 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
12ce0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
12cf0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
12d00 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 20  endif.  if( res 
12d10 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
12d20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12d30 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12d40 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
12d50 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
12d60 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
12d70 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12d80 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
12d90 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
12da0 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c   int unlockReadL
12db0 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
12dc0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
12dd0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
12de0 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  o;.  if( isNT() 
12df0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  ){.    res = win
12e00 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
12e10 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
12e20 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
12e30 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64  ZE, 0);.  }.#ifd
12e40 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
12e50 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
12e60 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
12e70 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
12e80 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
12e90 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
12ea0 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
12eb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
12ec0 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c  f( res==0 && ((l
12ed0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
12ee0 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52  LastError())!=ER
12ef0 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20  ROR_NOT_LOCKED) 
12f00 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
12f10 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
12f20 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
12f30 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12f40 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d  R_UNLOCK, pFile-
12f50 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12f60 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b           "unlock
12f70 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
12f80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
12f90 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
12fa0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
12fb0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
12fc0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
12fd0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
12fe0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12ff0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
13000 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
13010 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
13020 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
13030 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
13040 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
13050 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
13060 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
13070 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
13080 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
13090 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
130a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
130b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
130c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
130d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
130e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
130f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
13100 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
13110 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
13120 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
13130 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
13140 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
13150 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
13160 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
13170 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
13180 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
13190 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
131a0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
131b0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
131c0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
131d0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
131e0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
131f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13200 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13210 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
13220 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13230 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
13240 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
13250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13260 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
13270 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
13280 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
13290 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
132a0 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
132b0 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
132c0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
132d0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
132e0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
132f0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
13300 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13310 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
13320 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
13330 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
13340 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
13350 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
13360 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
13370 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13380 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
13390 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
133a0 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
133b0 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
133c0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
133d0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
133e0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
133f0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
13400 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
13410 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
13420 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
13430 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
13440 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
13450 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
13460 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
13470 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
13480 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
13490 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
134a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
134b0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
134c0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
134d0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
134e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
134f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13500 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
13510 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
13520 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
13530 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
13540 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
13550 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
13560 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
13570 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
13580 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
13590 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
135a0 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
135b0 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
135c0 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
135d0 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
135e0 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
135f0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
13600 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
13610 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
13620 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13630 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
13640 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
13650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13660 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13670 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
13680 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
13690 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
136a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
136b0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
136c0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
136d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
136e0 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
136f0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
13700 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
13710 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
13720 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
13730 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
13740 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
13750 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
13760 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
13770 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
13780 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
13790 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
137a0 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
137b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
137c0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
137d0 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
137e0 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
137f0 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
13800 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
13810 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
13820 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
13830 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
13840 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
13850 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
13860 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
13870 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
13880 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
13890 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
138a0 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
138b0 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
138c0 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
138d0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
138e0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
138f0 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
13930 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
13940 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
13950 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
13960 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
13970 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
13980 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
13990 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
139a0 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
139b0 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
139c0 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
139d0 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
139e0 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
139f0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
13a00 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
13a10 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
13a20 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
13a30 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
13a40 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
13a50 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
13a60 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
13a70 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
13a80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
13a90 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e  STRACE(("could n
13aa0 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47  ot get a PENDING
13ab0 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22   lock. cnt=%d\n"
13ac0 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  , cnt));.      i
13ad0 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33  f( cnt ) sqlite3
13ae0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b  _win32_sleep(1);
13af0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
13b00 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
13b10 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
13b20 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
13b30 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13b40 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
13b50 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
13b60 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
13b70 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
13b80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
13b90 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
13ba0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
13bb0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
13bc0 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
13bd0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
13be0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
13bf0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
13c00 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
13c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
13c20 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13c30 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
13c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
13c50 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
13c60 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
13c70 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
13c80 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
13c90 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
13ca0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
13cb0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
13cc0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
13cd0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
13ce0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
13cf0 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
13d00 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
13d10 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
13d20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
13d30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
13d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13d60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
13d70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
13d80 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
13d90 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
13da0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
13db0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
13dc0 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
13dd0 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
13de0 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
13df0 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
13e00 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
13e10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
13e20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
13e30 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
13e40 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
13e50 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
13e60 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
13e70 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
13e80 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63   = unlockReadLoc
13e90 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53  k(pFile);.    OS
13ea0 54 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c 6f  TRACE(("unreadlo
13eb0 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29  ck = %d\n", res)
13ec0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
13ed0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
13ee0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
13ef0 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
13f00 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
13f30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
13f40 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
13f50 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
13f60 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
13f70 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
13f80 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13f90 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
13fa0 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20  CE(("error-code 
13fb0 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72  = %d\n", lastErr
13fc0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52  no));.      getR
13fd0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
13fe0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13ff0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
14000 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
14010 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
14020 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
14030 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
14040 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
14050 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
14060 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
14070 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
14080 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
14090 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
140a0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
140b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
140c0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
140d0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
140e0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
140f0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
14100 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
14110 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
14120 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
14130 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
14140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
14150 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  lse{.    OSTRACE
14160 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25  (("LOCK FAILED %
14170 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20  d trying for %d 
14180 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70  but got %d\n", p
14190 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
141a0 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65      locktype, ne
141b0 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  wLocktype));.   
141c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
141d0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
141e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
141f0 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  USY;.  }.  pFile
14200 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
14210 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
14220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14230 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14240 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14250 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14260 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14270 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14280 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14290 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
142a0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
142b0 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
142c0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
142d0 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
142e0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
142f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
14300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14310 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
14320 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
14330 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
14340 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
14350 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14370 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14380 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
14390 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
143a0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
143b0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
143c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  K ){.    rc = 1;
143d0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
143e0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
143f0 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46  d (local)\n", pF
14400 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20  ile->h, rc));.  
14410 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
14420 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
14430 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
14440 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52  CKFILEEX_FLAGS,R
14450 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
14460 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
14470 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  rc ){.      winU
14480 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
14490 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
144a0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
144b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
144c0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
144d0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
144e0 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
144f0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
14500 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
14510 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
14520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14530 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14540 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14550 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
14560 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
14570 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
14580 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
14590 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
145a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
145b0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
145c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
145d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
145e0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
145f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
14600 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
14610 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14620 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
14630 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
14640 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
14650 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
14660 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
14670 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
14680 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14690 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
146a0 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
146b0 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
146c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
146d0 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
146e0 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
146f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14700 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
14710 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
14720 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14730 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
14740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14750 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
14760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
14770 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
14780 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
14790 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
147a0 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
147b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
147c0 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
147d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
147e0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
147f0 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
14800 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
14810 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
14820 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14830 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
14840 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
14850 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
14860 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
14870 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
14880 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
14890 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
148a0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
148b0 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
148c0 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
148d0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
148e0 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
148f0 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
14900 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
14910 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14920 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14930 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
14940 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
14950 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
14960 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lock", pFile->zP
14970 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
14980 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
14990 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
149a0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
149b0 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
149c0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
149d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
149e0 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
149f0 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
14a00 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
14a10 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
14a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
14a30 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
14a40 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
14a50 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14a60 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14a70 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69  1, 0);.  }.  pFi
14a80 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
14a90 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  u8)locktype;.  r
14aa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14ab0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
14ac0 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
14ad0 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
14ae0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
14af0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
14b00 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
14b10 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
14b20 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
14b30 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
14b40 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
14b50 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
14b60 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
14b70 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
14b80 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
14b90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14ba0 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
14bb0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
14bc0 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
14bd0 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
14be0 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
14bf0 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
14c00 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
14c10 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
14c20 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
14c30 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
14c40 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
14c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
14c60 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
14c70 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
14c80 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
14c90 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
14ca0 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
14cb0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
14cc0 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  uf);../*.** Cont
14cd0 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
14ce0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
14cf0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
14d00 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
14d10 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
14d20 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
14d30 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
14d40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14d50 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
14d60 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
14d70 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
14d80 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
14d90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
14da0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
14db0 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
14dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14dd0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
14de0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
14df0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
14e00 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
14e10 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
14e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14e30 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
14e40 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
14e50 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
14e60 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
14e70 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
14e80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14e90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14ea0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14eb0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
14ec0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   {.      if( pFi
14ed0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
14ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14ef0 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
14f00 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
14f10 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
14f20 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
14f30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14f40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
14f50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
14f60 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
14f70 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
14f80 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
14f90 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
14fa0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14fb0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
14fc0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
14fd0 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
14fe0 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
14ff0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
15000 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
15010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15020 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
15030 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15040 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15050 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
15060 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
15070 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
15080 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
15090 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
150a0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
150b0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
150c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
150e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
150f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
15100 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
15110 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
15120 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
15130 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
15140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15160 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
15170 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
15180 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
15190 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
151a0 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72  win32");.      r
151b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
151c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
151d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
151e0 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
151f0 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
15200 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
15210 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
15220 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
15230 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
15240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15250 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
15260 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
15270 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
15280 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
15290 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
152a0 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
152b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
152c0 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
152d0 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
152e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
152f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15300 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
15310 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
15320 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
15330 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
15340 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
15350 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
15360 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
15370 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
15380 0a 20 20 20 20 20 20 20 20 67 65 74 54 65 6d 70  .        getTemp
15390 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
153a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
153b0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  File);.        *
153c0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
153d0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
153e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
153f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
15400 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
15410 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
15420 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
15430 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
15440 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
15450 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
15460 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
15470 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
15480 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
15490 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
154a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154b0 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46  *(i64*)pArg = pF
154c0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
154d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
154e0 69 6d 69 74 3e 3d 30 20 29 20 70 46 69 6c 65 2d  imit>=0 ) pFile-
154f0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e  >mmapSizeMax = n
15500 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 72  ewLimit;.      r
15510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15530 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
15540 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
15550 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
15560 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
15570 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
15580 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
15590 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
155a0 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
155b0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
155c0 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
155d0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
155e0 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
155f0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
15600 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
15610 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
15620 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
15630 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
15640 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
15650 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
15660 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
15670 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
15680 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
15690 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
156a0 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
156b0 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
156c0 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
156d0 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
156e0 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  nt winSectorSize
156f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15700 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a  d){.  (void)id;.
15710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15720 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
15730 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
15740 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66  turn a vector of
15750 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
15760 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74  ristics..*/.stat
15770 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65  ic int winDevice
15780 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
15790 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
157a0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20  ){.  winFile *p 
157b0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
157c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
157d0 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
157e0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20  E_WHEN_OPEN |.  
157f0 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c         ((p->ctrl
15800 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
15810 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43  PSOW)?SQLITE_IOC
15820 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
15830 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69  RWRITE:0);.}..#i
15840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15850 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69  T_WAL../* .** Wi
15860 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
15870 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
15880 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
15890 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
158a0 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
158b0 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
158c0 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
158d0 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
158e0 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
158f0 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
15900 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
15910 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e  ze..*/.SYSTEM_IN
15920 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
15930 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
15940 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
15950 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
15960 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
15970 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
15980 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
15990 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
159a0 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
159b0 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69   used by .** thi
159c0 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
159d0 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
159e0 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
159f0 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
15a00 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
15a10 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
15a20 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
15a30 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
15a40 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
15a50 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
15a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
15a70 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
15a80 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
15a90 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
15aa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
15ab0 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
15ac0 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
15ad0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
15ae0 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76  .**   winShmLeav
15af0 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74  eMutex().*/.stat
15b00 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e  ic void winShmEn
15b10 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
15b20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15b30 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
15b40 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15b50 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
15b60 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
15b70 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  oid winShmLeaveM
15b80 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
15b90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15ba0 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
15bb0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15bc0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
15bd0 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
15be0 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
15bf0 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  nt winShmMutexHe
15c00 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
15c10 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
15c20 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
15c30 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
15c40 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
15c50 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TER));.}.#endif.
15c60 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
15c70 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
15c80 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70  a single file op
15c90 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ened and mmapped
15ca0 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73   to provide.** s
15cb0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57  hared memory.  W
15cc0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
15cd0 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
15ce0 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c  ce the same.** l
15cf0 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68  og-summary, each
15d00 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20   thread has its 
15d10 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65  own winFile obje
15d20 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
15d30 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  .** point to a s
15d40 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f  ingle instance o
15d50 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20  f this object.  
15d60 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
15d70 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  each.** log-summ
15d80 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ary is opened on
15d90 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
15da0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68  ess..**.** winSh
15db0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
15dc0 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
15dd0 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
15de0 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
15df0 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
15e00 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
15e10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
15e20 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
15e30 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70    nRef.**      p
15e40 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Next .**.** The 
15e50 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
15e60 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
15e70 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
15e80 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
15e90 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
15ea0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
15eb0 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68  .** Either winSh
15ec0 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
15ed0 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53   be held or winS
15ee0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
15ef0 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  nd.** winShmMute
15f00 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
15f10 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
15f20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
15f30 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
15f40 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
15f50 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
15f60 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65  mNode {.  sqlite
15f70 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
15f80 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
15f90 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
15fa0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
15fb0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
15fc0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
15fd0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  he file */.  win
15fe0 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20  File hFile;     
15ff0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
16000 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f  handle from winO
16010 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a  pen */..  int sz
16020 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
16030 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16040 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
16050 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
16060 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
16070 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16080 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20   array apRegion 
16090 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52  */.  struct ShmR
160a0 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44  egion {.    HAND
160b0 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
160c0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
160d0 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46  dle from CreateF
160e0 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ileMapping */.  
160f0 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20    void *pMap;.  
16100 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57  } *aRegion;.  DW
16110 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
16120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16130 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72  Windows errno fr
16140 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20  om the last I/O 
16150 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20  error */..  int 
16160 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
16170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16180 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63   of winShm objec
16190 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
161a0 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  his */.  winShm 
161b0 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
161c0 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68      /* All winSh
161d0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
161e0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
161f0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78  winShmNode *pNex
16200 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  t;         /* Ne
16210 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  xt in list of al
16220 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
16230 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ects */.#ifdef S
16240 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
16250 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
16260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
16270 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68   available winSh
16280 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
16290 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
162a0 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66   global array of
162b0 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
162c0 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  objects..**.** T
162d0 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  he winShmMutexHe
162e0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
162f0 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  e while reading 
16300 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  or writing this 
16310 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
16320 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53  winShmNode *winS
16330 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  hmNodeList = 0;.
16340 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
16350 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
16360 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
16370 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
16380 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
16390 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
163a0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
163b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
163c0 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
163d0 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
163e0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
163f0 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
16400 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
16410 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  .**.**    winShm
16420 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20  .pShmNode.**    
16430 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  winShm.id.**.** 
16440 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
16450 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
16460 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68    The winShm.pSh
16470 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73  mNode->mutex mus
16480 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
16490 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
164a0 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
164b0 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ds..*/.struct wi
164c0 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e  nShm {.  winShmN
164d0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
164e0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
164f0 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  lying winShmNode
16500 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e   object */.  win
16510 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
16520 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
16530 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20  winShm with the 
16540 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20  same winShmNode 
16550 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
16560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16570 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
16580 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  ng the winShmNod
16590 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
165a0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
165b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
165c0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
165d0 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
165e0 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
165f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
16600 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
16610 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  held */.#ifdef S
16620 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
16630 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
16640 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
16650 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
16660 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68  n with its winSh
16670 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
16680 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
16690 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
166a0 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
166b0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  WIN_SHM_BASE   (
166c0 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
166d0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
166e0 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
166f0 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  te */.#define WI
16700 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49  N_SHM_DMS    (WI
16710 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  N_SHM_BASE+SQLIT
16720 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
16730 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
16740 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
16750 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
16760 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62  or all n bytes b
16770 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74  eginning at ofst
16780 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48  ..*/.#define _SH
16790 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69  M_UNLCK  1.#defi
167a0 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32  ne _SHM_RDLCK  2
167b0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52  .#define _SHM_WR
167c0 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e  LCK  3.static in
167d0 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  t winShmSystemLo
167e0 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ck(.  winShmNode
167f0 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41   *pFile,    /* A
16800 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
16810 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
16820 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
16830 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
16840 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d           /* _SHM
16850 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c  _UNLCK, _SHM_RDL
16860 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43  CK, or _SHM_WRLC
16870 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16890 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  Offset to first 
168a0 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
168b0 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  d/unlocked */.  
168c0 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20  int nByte       
168d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
168e0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
168f0 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b   or unlock */.){
16900 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
16910 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16920 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
16930 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
16940 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
16950 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
16960 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
16970 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
16980 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
16990 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
169a0 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
169b0 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52  ex) || pFile->nR
169c0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52  ef==0 );..  /* R
169d0 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
169e0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
169f0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
16a00 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
16a10 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  CK ){.    rc = w
16a20 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
16a30 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66  ile->hFile.h, of
16a40 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
16a50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
16a60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
16a70 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
16a80 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ers */.    DWORD
16a90 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
16aa0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
16ab0 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f  TELY;.    if( lo
16ac0 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
16ad0 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
16ae0 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
16af0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
16b00 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
16b10 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
16b20 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
16b30 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
16b40 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20  }.  .  if( rc!= 
16b50 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
16b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
16b70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16b80 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
16b90 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16bb0 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
16bc0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25  (("SHM-LOCK %d %
16bd0 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c  s %s 0x%08lx\n",
16be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69   .           pFi
16bf0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  le->hFile.h,.   
16c00 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
16c10 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
16c20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20  failed",.       
16c30 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53      lockType==_S
16c40 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f  HM_UNLCK ? "Unlo
16c50 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63  ckFileEx" : "Loc
16c60 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20  kFileEx",.      
16c70 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16c80 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75  Errno));..  retu
16c90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
16ca0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
16cb0 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
16cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16cd0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
16ce0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
16cf0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
16d00 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
16d10 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
16d20 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
16d30 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
16d40 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
16d50 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
16d60 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
16d70 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
16d80 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
16d90 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
16da0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
16db0 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
16dc0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
16dd0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
16de0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
16df0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
16e00 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
16e10 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
16e20 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
16e30 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
16e40 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
16e50 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f  hmNode *p;.  BOO
16e60 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28  L bRc;.  assert(
16e70 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
16e80 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  () );.  pp = &wi
16e90 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
16ea0 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
16eb0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
16ec0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
16ed0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
16ee0 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73  if( p->mutex ) s
16ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
16f00 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
16f10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16f20 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
16f30 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
16f40 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
16f50 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
16f60 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
16f70 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
16f80 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65   pid-%d unmap re
16f90 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
16fc0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
16fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fe0 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
16ff0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
17000 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
17010 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
17020 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
17030 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
17040 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63  M-PURGE pid-%d c
17050 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25  lose region=%d %
17060 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
17070 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
17080 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
17090 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  d(), i,.        
170a0 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22           bRc ? "
170b0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
170c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
170d0 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d  if( p->hFile.h!=
170e0 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65  NULL && p->hFile
170f0 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  .h!=INVALID_HAND
17100 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
17110 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17120 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17130 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
17140 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
17150 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
17160 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17170 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
17180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
17190 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
171a0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
171b0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
171c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
171d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
171e0 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
171f0 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
17200 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
17210 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
17220 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
17230 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
17240 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
17250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
17260 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
17270 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17280 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
17290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
172a0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
172b0 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
172c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
172d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
172e0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
172f0 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
17300 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
17310 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
17320 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
17330 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
17340 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
17350 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
17360 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
17370 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
17380 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
17390 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
173a0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
173b0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
173c0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
173d0 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
173e0 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
173f0 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
17400 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
17410 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
17420 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
17430 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17450 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
17460 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
17470 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
17480 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
17490 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
174a0 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
174b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
174c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
174e0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
174f0 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
17500 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
17510 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
17520 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
17530 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
17540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
17560 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
17570 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
17580 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
17590 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
175a0 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
175b0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
175c0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
175d0 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
175e0 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
175f0 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
17600 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
17610 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
17620 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
17630 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
17640 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
17650 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
17660 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17670 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17680 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d  NOMEM;.  nName =
17690 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
176a0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
176b0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
176c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
176d0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
176e0 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20  nName + 17 );.  
176f0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
17700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17710 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
17720 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
17730 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  M;.  }.  pNew->z
17740 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
17750 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71  *)&pNew[1];.  sq
17760 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
17770 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a  Name+15, pNew->z
17780 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
17790 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
177a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65  );.  sqlite3File
177b0 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
177c0 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  Path, pNew->zFil
177d0 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c  ename); ..  /* L
177e0 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
177f0 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
17800 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
17810 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
17820 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
17830 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
17840 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
17850 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
17860 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
17870 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17880 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
17890 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
178a0 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
178b0 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
178c0 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
178d0 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
178e0 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
178f0 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
17900 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
17910 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
17920 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
17930 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
17940 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
17950 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
17960 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
17970 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
17980 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
17990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
179a0 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
179b0 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
179c0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
179d0 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
179e0 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
179f0 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
17a00 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
17a10 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
17a20 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
17a30 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
17a40 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
17a50 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
17a60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
17a70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
17a80 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17a90 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
17aa0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
17ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
17ac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
17ad0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
17ae0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
17af0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
17b00 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
17b10 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
17b20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
17b30 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
17b40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17b50 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
17b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17b70 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
17b80 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
17b90 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
17ba0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
17bd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17be0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
17bf0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20  OPEN_CREATE,.   
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
17c10 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
17c20 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20  _OK!=rc ){.     
17c30 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
17c40 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
17c50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
17c60 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
17c70 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
17c80 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
17c90 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
17ca0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
17cb0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
17cc0 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  h. .    */.    i
17cd0 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
17ce0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
17cf0 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
17d00 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
17d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
17d20 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
17d30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
17d40 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
17d50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
17d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
17d80 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
17d90 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
17da0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dc0 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
17dd0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
17de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17df0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17e00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
17e10 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
17e20 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
17e30 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
17e40 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
17e50 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
17e60 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
17e70 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
17e80 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
17e90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
17ea0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
17eb0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
17ec0 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
17ed0 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
17ee0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
17ef0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
17f00 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
17f10 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
17f20 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
17f30 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
17f40 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
17f50 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
17f60 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
17f70 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
17f80 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
17f90 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
17fa0 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
17fb0 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
17fc0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
17fd0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
17fe0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
17ff0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
18000 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
18010 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
18020 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
18030 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
18040 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
18050 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
18060 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
18070 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
18080 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
18090 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
180a0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
180b0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
180c0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
180d0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
180e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
180f0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
18100 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
18110 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
18120 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
18130 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
18140 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
18150 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
18160 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18170 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
18180 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
181a0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
181b0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
181c0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
181d0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
181e0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
181f0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
18200 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
18210 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
18220 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
18230 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
18240 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
18250 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
18260 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
18270 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
18280 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
18290 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
182a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
182b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
182c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
182d0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
182e0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
182f0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
18300 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
18310 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
18320 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
18330 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
18340 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
18350 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
18360 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
18370 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
18380 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
18390 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
183a0 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
183b0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
183c0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
183d0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
183e0 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
183f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18400 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
18410 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
18420 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
18430 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
18440 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
18450 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
18460 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
18470 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18480 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
18490 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
184a0 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
184b0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
184c0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
184d0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
184e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
184f0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
18500 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
18510 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
18520 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
18530 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
18540 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
18550 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
18560 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18570 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
18580 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
18590 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
185a0 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
185b0 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
185c0 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
185d0 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
185e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
185f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
18600 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
18610 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
18620 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
18630 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
18640 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
18650 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
18660 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
18670 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
18680 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
18690 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
186a0 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
186b0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
186c0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
186d0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
186e0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
186f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
18700 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
18710 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
18720 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
18730 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
18740 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
18750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18760 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18770 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
18780 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
18790 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
187a0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
187b0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
187c0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
187d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
187e0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
187f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
18800 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
18810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18820 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
18830 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
18840 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
18870 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
18880 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
18890 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
188a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
188b0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
188c0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
188d0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
188e0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
188f0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
18900 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
18910 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
18920 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
18930 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
18940 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
18950 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
18960 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
18970 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18990 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
189a0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
189b0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
189c0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
189d0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
189e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
18a10 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
18a40 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
18a50 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
18a60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
18a70 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
18a80 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
18a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
18aa0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
18ab0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
18ac0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
18ad0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
18ae0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
18af0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
18b00 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
18b10 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
18b20 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
18b30 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
18b40 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
18b50 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
18b60 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
18b70 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
18b80 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
18b90 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
18ba0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
18bb0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
18bc0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
18bd0 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
18be0 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
18bf0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
18c00 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
18c10 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
18c20 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
18c30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
18c40 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
18c50 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
18c60 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
18c70 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
18c80 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
18c90 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
18ca0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
18cb0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
18cc0 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
18cd0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
18ce0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
18cf0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
18d00 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
18d10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18d20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
18d30 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
18d40 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
18d50 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
18d60 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
18d70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
18d80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
18d90 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
18da0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
18db0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
18dc0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
18dd0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
18de0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
18df0 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
18e00 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
18e10 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
18e20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18e30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
18e40 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
18e50 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
18e60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18e70 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
18e80 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
18e90 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
18ea0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
18eb0 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
18ec0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
18ed0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
18ee0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
18ef0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
18f00 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
18f10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
18f20 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
18f30 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
18f40 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
18f50 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
18f60 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
18f70 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
18f80 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
18f90 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
18fa0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
18fb0 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
18fc0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
18fd0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
18fe0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
18ff0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
19000 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
19010 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
19020 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
19030 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19040 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
19050 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
19060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
19070 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
19080 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
19090 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
190a0 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
190b0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
190c0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
190d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
190e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
190f0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
19100 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
19110 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
19120 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
19130 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
19140 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
19150 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
19160 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
19170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19180 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
19190 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
191a0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
191b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
191c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
191d0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
191e0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
191f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
19200 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
19210 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
19220 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
19230 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
19240 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
19250 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
19260 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
19270 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
19280 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
19290 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
192a0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
192b0 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
192c0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
192d0 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
192e0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
192f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
19300 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19320 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
19330 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
19340 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
19350 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
19360 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
19370 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
19380 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
19390 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
193a0 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
193b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
193c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
193d0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
193e0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
193f0 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
19400 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
19410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19430 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
19440 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
19450 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
19460 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
19470 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
19480 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19490 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
194a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
194b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
194c0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
194d0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
194e0 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %03x %s\n",.    
194f0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69         p->id, (i
19500 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
19510 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73  rocessId(), p->s
19520 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
19530 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
19540 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22     rc ? "failed"
19550 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74   : "ok"));.  ret
19560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19570 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
19580 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
19590 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
195a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
195b0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
195c0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
195d0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
195e0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
195f0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
19600 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
19610 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
19620 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
19630 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
19640 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
19650 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
19660 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
19670 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
19680 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
19690 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
196a0 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79  fd);.  /* Memory
196b0 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f  Barrier(); // do
196c0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64  es not work -- d
196d0 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e  o not know why n
196e0 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  ot */.  winShmEn
196f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69  terMutex();.  wi
19700 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
19710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19720 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19730 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
19740 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
19750 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
19760 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
19770 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
19780 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
19790 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
197a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
197b0 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
197c0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
197d0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
197e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
197f0 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
19800 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
19810 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
19820 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
19830 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
19840 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
19850 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
19860 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
19870 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65  isWrite paramete
19880 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
19890 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
198a0 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
198b0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
198c0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
198d0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
198e0 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
198f0 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
19900 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
19910 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
19920 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
19930 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
19940 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
19950 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
19960 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
19970 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
19980 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
19990 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
199a0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
199b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
199c0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
199d0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
199e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
199f0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
19a00 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
19a10 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
19a20 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
19a30 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
19a40 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
19a50 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
19a60 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
19a70 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
19a80 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
19a90 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
19aa0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
19ab0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
19ac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19ad0 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
19ae0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b00 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
19b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
19b20 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
19b50 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
19b60 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b80 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
19b90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
19ba0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19bb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
19bc0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
19bd0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
19be0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
19bf0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
19c00 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
19c10 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
19c20 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
19c30 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
19c40 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
19c50 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
19c60 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
19c70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19c80 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
19c90 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
19ca0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
19cb0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
19cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
19ce0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
19cf0 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
19d00 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
19d10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
19d20 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
19d30 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19d40 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
19d50 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
19d60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
19d70 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
19d80 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19d90 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
19da0 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
19db0 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
19dc0 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
19dd0 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
19de0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
19df0 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
19e00 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
19e10 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
19e20 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
19e30 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e50 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
19e60 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
19e70 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
19e80 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
19e90 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
19ea0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
19eb0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
19ec0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
19ed0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
19ee0 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
19ef0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
19f00 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
19f10 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
19f20 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
19f30 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
19f40 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
19f50 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
19f60 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
19f70 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
19f80 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
19f90 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
19fa0 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
19fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19fc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
19fd0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
19fe0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
19ff0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1a000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a010 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
1a020 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1a030 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1a040 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1a050 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
1a060 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
1a070 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1a080 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1a090 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
1a0a0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1a0b0 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
1a0c0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
1a0d0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
1a0e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1a0f0 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
1a100 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
1a110 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
1a120 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
1a130 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
1a140 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
1a150 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1a160 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
1a170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a180 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
1a190 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1a1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1a1b0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1a1c0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1a1d0 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
1a1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a1f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a200 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1a210 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1a220 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1a230 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a250 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
1a260 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1a270 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1a280 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1a290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1a2a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1a2b0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1a2c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1a2d0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1a2e0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
1a2f0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1a300 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1a310 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1a320 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1a330 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1a340 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1a350 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1a360 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a370 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1a380 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1a390 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1a3a0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1a3b0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1a3c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1a3d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1a3e0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1a3f0 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1a400 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1a410 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1a420 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1a430 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1a440 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1a450 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1a460 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c  */.     .#if SQL
1a470 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1a480 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1a490 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
1a4a0 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  mApp(pShmNode->h
1a4b0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1a4c0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1a4d0 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e  DWRITE, nByte, N
1a4e0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1a4f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a500 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1a510 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1a520 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1a530 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngW(pShmNode->hF
1a540 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1a550 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1a560 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1a570 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1a580 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1a590 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1a5a0 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20  NSI).      hMap 
1a5b0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1a5c0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
1a5d0 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20  >hFile.h, .     
1a5e0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1a5f0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1a600 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1a610 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1a620 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1a630 50 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20  P pid-%d create 
1a640 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d  region=%d nbyte=
1a650 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
1a660 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
1a670 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a680 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1a690 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
1a6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6b0 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
1a6c0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1a6d0 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
1a6e0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
1a6f0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
1a700 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1a710 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1a720 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
1a730 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1a740 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
1a750 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
1a760 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1a770 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1a780 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
1a790 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1a7a0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1a7b0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1a7c0 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
1a7d0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1a7e0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1a7f0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1a800 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
1a810 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1a820 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
1a830 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1a840 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1a850 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
1a860 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1a870 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1a880 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1a890 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1a8a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1a8b0 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72  MAP pid-%d map r
1a8c0 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d  egion=%d offset=
1a8d0 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22  %d size=%d %s\n"
1a8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a8f0 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
1a900 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1a910 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1a920 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
1a940 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
1a950 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1a960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a970 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
1a980 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
1a990 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1a9a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1a9b0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1a9c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1a9d0 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
1a9e0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
1aa10 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1aa20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1aa30 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1aa40 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
1aa50 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1aa60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1aa70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1aa80 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1aa90 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
1aaa0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1aab0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1aac0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
1aad0 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
1aae0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1aaf0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
1ab00 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
1ab10 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1ab20 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
1ab30 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1ab40 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
1ab50 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
1ab60 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1ab70 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1ab80 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1ab90 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
1aba0 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
1abb0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1abc0 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
1abd0 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
1abe0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
1abf0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
1ac00 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
1ac10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ac20 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1ac30 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1ac40 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
1ac50 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
1ac60 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1ac70 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1ac80 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
1ac90 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
1aca0 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
1acb0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1acc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1acd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e   */../*.** Clean
1ace0 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64 20  s up the mapped 
1acf0 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  region of the sp
1ad00 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66  ecified file, if
1ad10 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   any..*/.static 
1ad20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1ad30 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1ad40 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1ad50 65 21 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c 49  e!=0 );.#if SQLI
1ad60 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1ad70 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1ad80 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
1ad90 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69    if( !osUnmapVi
1ada0 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
1adb0 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20  pMapRegion) ){. 
1adc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1add0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1ade0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1adf0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1ae00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1ae10 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1ae20 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 22 77 69 6e 55 6e 6d 61 70 31 22 2c 20 70 46   "winUnmap1", pF
1ae50 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1ae60 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d   }.    pFile->pM
1ae70 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
1ae80 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ae90 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
1aea0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1aeb0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1aec0 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c  pFile->hMap!=NUL
1aed0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  L ){.    if( !os
1aee0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
1aef0 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20  e->hMap) ){.    
1af00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1af10 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1af20 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 65 74  ror();.      ret
1af30 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1af40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1af50 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1af60 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1af80 69 6e 55 6e 6d 61 70 32 22 2c 20 70 46 69 6c 65  inUnmap2", pFile
1af90 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1afa0 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
1afb0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64  = NULL;.  }.#end
1afc0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
1afd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1afe0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1aff0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ZE>0./*.** Memor
1b000 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
1b010 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
1b020 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
1b030 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
1b040 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
1b050 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
1b060 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
1b070 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
1b080 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
1b090 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
1b0a0 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
1b0b0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1b0c0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
1b0d0 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
1b0e0 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
1b0f0 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
1b100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b110 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1b120 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
1b130 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
1b140 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
1b150 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
1b160 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
1b170 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
1b180 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
1b190 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
1b1a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
1b1b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
1b1c0 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
1b1d0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1b1e0 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
1b1f0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
1b200 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
1b210 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
1b220 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
1b230 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
1b240 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
1b250 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1b260 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ZE, whichever is
1b270 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
1b280 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1b290 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
1b2a0 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
1b2b0 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
1b2c0 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
1b2d0 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
1b2e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1b2f0 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
1b300 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1b310 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1b320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b330 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  Mapfile(winFile 
1b340 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pFd, sqlite3_in
1b350 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71  t64 nByte){.  sq
1b360 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70  lite3_int64 nMap
1b370 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20   = nByte;.  int 
1b380 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1b390 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
1b3a0 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
1b3b0 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
1b3c0 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
1b3d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1b3e0 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72   nMap<0 ){.    r
1b3f0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1b400 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
1b410 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20  Fd, &nMap);.    
1b420 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1b430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b440 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
1b450 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
1b460 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
1b470 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
1b480 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
1b490 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e  .  }.  nMap &= ~
1b4a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1b4b0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1b4c0 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20  eSize - 1);. .  
1b4d0 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70  if( nMap==0 && p
1b4e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  Fd->mmapSize>0 )
1b4f0 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  {.    winUnmapfi
1b500 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69  le(pFd);.  }.  i
1b510 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
1b520 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f  apSize ){.    vo
1b530 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  id *pNew = 0;.  
1b540 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20    DWORD protect 
1b550 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b  = PAGE_READONLY;
1b560 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
1b570 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   = FILE_MAP_READ
1b580 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ;..    winUnmapf
1b590 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66  ile(pFd);.    if
1b5a0 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
1b5b0 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
1b5c0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1b5d0 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1b5e0 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1b5f0 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
1b600 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
1b610 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b620 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  RT.    pFd->hMap
1b630 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1b640 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46  appingFromApp(pF
1b650 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1b660 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29  ect, nMap, NULL)
1b670 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1b680 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1b690 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e  _WIDE).    pFd->
1b6a0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1b6b0 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d  ileMappingW(pFd-
1b6c0 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1b6d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1b700 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1b710 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1b740 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1b750 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1b760 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1b770 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1b780 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1b790 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b7a0 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
1b7b0 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1b7e0 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1b7f0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1b820 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1b830 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1b840 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
1b850 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
1b860 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1b870 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1b880 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1b890 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1b8a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1b8b0 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1b8c0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1b8d0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1b8e0 70 66 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61  pfile", pFd->zPa
1b8f0 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
1b900 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
1b910 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
1b920 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
1b930 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
1b940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b960 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
1b970 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1b980 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
1b990 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b9a0 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  NRT.    pNew = o
1b9b0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1b9c0 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c  omApp(pFd->hMap,
1b9d0 20 66 6c 61 67 73 2c 20 30 2c 20 6e 4d 61 70 29   flags, 0, nMap)
1b9e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65  ;.#else.    asse
1b9f0 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1ba00 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1ba10 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
1ba20 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
1ba30 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1ba40 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
1ba50 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1ba60 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1ba70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1ba80 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
1ba90 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
1baa0 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
1bab0 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
1bac0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
1bad0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1bae0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1baf0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
1bb00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1bb10 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
1bb20 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1bb30 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1bb40 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  ile", pFd->zPath
1bb50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1bb60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bb70 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
1bb80 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20  gion = pNew;.   
1bb90 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
1bba0 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e   nMap;.    pFd->
1bbb0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
1bbc0 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 72 65   nMap;.  }..  re
1bbd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bbe0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1bbf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1bc00 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
1bc10 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
1bc20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1bc30 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
1bc40 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
1bc50 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
1bc60 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
1bc70 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
1bc80 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
1bc90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
1bca0 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
1bcb0 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
1bcc0 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
1bcd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1bce0 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
1bcf0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
1bd00 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
1bd10 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
1bd20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1bd30 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
1bd40 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1bd50 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
1bd60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
1bd70 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
1bd80 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
1bd90 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
1bda0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
1bdb0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
1bdc0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1bdd0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
1bde0 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
1bdf0 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
1be00 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
1be10 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
1be20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1be30 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  inFetch(sqlite3_
1be40 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
1be50 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
1be60 69 64 20 2a 2a 70 70 29 7b 0a 20 20 77 69 6e 46  id **pp){.  winF
1be70 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
1be80 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
1be90 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1bea0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1beb0 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51  *pp = 0;..#if SQ
1bec0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1bed0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
1bee0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
1bef0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
1bf00 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
1bf10 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1bf20 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
1bf30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bf40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1bf50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1bf60 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
1bf70 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
1bf80 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
1bf90 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
1bfa0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
1bfb0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
1bfc0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
1bfd0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1bfe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1bff0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
1c000 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
1c010 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
1c020 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
1c030 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
1c040 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
1c050 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
1c060 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
1c070 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
1c080 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1c090 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1c0a0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1c0b0 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
1c0c0 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
1c0d0 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
1c0e0 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
1c0f0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
1c100 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
1c110 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
1c120 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1c130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c140 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
1c150 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
1c160 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
1c170 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
1c180 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
1c190 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
1c1a0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
1c1b0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
1c1c0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
1c1d0 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
1c1e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
1c1f0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
1c200 64 20 2a 70 29 7b 0a 20 20 77 69 6e 46 69 6c 65  d *p){.  winFile
1c210 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65   *pFd = (winFile
1c220 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
1c230 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1c240 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  se file */..  /*
1c250 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
1c260 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
1c270 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
1c280 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
1c290 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
1c2a0 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
1c2b0 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
1c2c0 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
1c2d0 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
1c2e0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
1c2f0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1c300 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
1c310 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
1c320 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
1c330 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
1c340 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
1c350 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
1c360 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
1c370 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
1c380 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
1c390 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
1c3a0 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
1c3b0 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
1c3c0 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
1c3d0 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20    /* FIXME:  If 
1c3e0 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c  Windows truly al
1c3f0 77 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72  ways prevents tr
1c400 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65  uncating or dele
1c410 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ting a.    ** fi
1c420 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69  le while a mappi
1c430 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e  ng is held, then
1c440 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
1c450 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61  inUnmapfile() ca
1c460 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e  ll.    ** is unn
1c470 65 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e  ecessary can can
1c480 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f   be omitted - po
1c490 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76  tentially improv
1c4a0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f  ing.    ** perfo
1c4b0 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  rmance.  */.    
1c4c0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1c4d0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1c4e0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
1c4f0 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
1c500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c510 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1c520 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1c530 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1c540 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1c550 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c560 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1c570 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1c580 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1c590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
1c600 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
1c610 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
1c620 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
1c630 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
1c640 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
1c650 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1c660 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1c670 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
1c680 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1c6b0 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1c6e0 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c700 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
1c710 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
1c740 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
1c770 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1c7a0 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
1c7d0 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
1c800 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
1c830 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
1c840 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1c850 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1c860 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
1c870 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1c890 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
1c8a0 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1c8d0 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
1c8e0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
1c8f0 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
1c900 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1c910 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
1c940 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
1c970 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
1c980 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1c990 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1c9a0 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
1c9b0 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
1c9c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
1c9d0 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
1c9e0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
1c9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
1ca00 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
1ca10 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
1ca30 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
1ca40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caa0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1cab0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1cac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cad0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1cae0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1caf0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1cb00 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1cb10 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1cb20 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1cb30 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .*/../*.** Conve
1cb40 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
1cb50 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
1cb60 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
1cb70 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
1cb80 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
1cb90 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
1cba0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1cbb0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
1cbc0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1cbd0 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
1cbe0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1cbf0 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
1cc00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cc10 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
1cc20 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
1cc30 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
1cc40 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
1cc50 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
1cc60 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
1cc70 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
1cc80 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1cc90 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1cca0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1ccb0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1ccc0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1ccd0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1cce0 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1ccf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1cd00 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1cd10 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1cd20 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1cd30 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1cd40 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1cd50 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1cd60 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1cd70 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1cd80 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1cd90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1cda0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1cdb0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1cdc0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1cdd0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1cde0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1cdf0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1ce00 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1ce10 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1ce20 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1ce30 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1ce40 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1ce50 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1ce60 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61  nTempPath;.  cha
1ce70 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f  r zTempPath[MAX_
1ce80 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49  PATH+2];..  /* I
1ce90 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1cea0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1ceb0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1cec0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1ced0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1cee0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1cef0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1cf00 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1cf10 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1cf20 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
1cf30 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1cf40 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1cf50 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
1cf60 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68  memset(zTempPath
1cf70 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29  , 0, MAX_PATH+2)
1cf80 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
1cf90 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
1cfa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1cfb0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1cfc0 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
1cfd0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
1cfe0 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
1cff0 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
1d000 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73 65 20 69  S_WINRT.  else i
1d010 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1d020 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
1d030 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
1d040 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
1d050 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57    osGetTempPathW
1d060 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57  (MAX_PATH-30, zW
1d070 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d  idePath);.    zM
1d080 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f  ulti = unicodeTo
1d090 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
1d0a0 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
1d0b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d0c0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1d0d0 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
1d0e0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
1d0f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1d100 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
1d110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1d120 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1d130 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
1d140 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1d150 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1d160 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
1d170 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
1d180 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f  r zMbcsPath[MAX_
1d190 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74  PATH];.    osGet
1d1a0 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41  TempPathA(MAX_PA
1d1b0 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68  TH-30, zMbcsPath
1d1c0 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73  );.    zUtf8 = s
1d1d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1d1e0 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50  s_to_utf8(zMbcsP
1d1f0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  ath);.    if( zU
1d200 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tf8 ){.      sql
1d210 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1d220 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
1d230 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66  Path, "%s", zUtf
1d240 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1d250 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
1d260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d280 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1d290 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
1d2a0 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
1d2b0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
1d2c0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
1d2d0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
1d2e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
1d2f0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
1d300 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
1d310 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
1d320 0a 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73  .  nTempPath = s
1d330 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d340 54 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66  TempPath);..  if
1d350 28 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73  ( (nTempPath + s
1d360 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
1d370 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1d380 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
1d390 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74   nBuf ){.    ret
1d3a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1d3b0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e  ;.  }..  for(i=n
1d3c0 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26 26  TempPath; i>0 &&
1d3d0 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d   zTempPath[i-1]=
1d3e0 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='\\'; i--){}.  
1d3f0 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
1d400 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1d410 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
1d420 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20  Buf, (nTempPath 
1d430 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  > 0) ?.         
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1d450 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
1d460 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53 51  FILE_PREFIX : SQ
1d470 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1d480 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20 20  REFIX,.         
1d490 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50            zTempP
1d4a0 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
1d4b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
1d4c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
1d4d0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
1d4e0 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
1d4f0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
1d500 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
1d510 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1d520 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1d530 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1d540 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1d550 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
1d560 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
1d570 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
1d580 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73  EMP FILENAME: %s
1d590 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
1d5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d5b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
1d5c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
1d5d0 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
1d5e0 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
1d5f0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
1d600 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
1d610 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1d620 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
1d630 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
1d640 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
1d650 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1d660 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1d670 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
1d680 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
1d690 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
1d6a0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
1d6b0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1d6c0 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28  no;..  if( isNT(
1d6d0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
1d6e0 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
1d6f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1d700 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1d710 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1d720 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1d730 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1d740 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
1d750 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1d760 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
1d770 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
1d7a0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
1d7d0 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72  trData)) && retr
1d7e0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1d7f0 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
1d800 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
1d810 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49    return 0; /* I
1d820 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a  nvalid name? */.
1d830 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d      }.    attr =
1d840 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
1d850 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66  eAttributes;.#if
1d860 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1d870 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
1d880 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
1d890 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
1d8a0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
1d8b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
1d8c0 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41  turn (attr!=INVA
1d8d0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1d8e0 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49  TES) && (attr&FI
1d8f0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
1d900 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ECTORY);.}../*.*
1d910 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
1d920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1d930 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1d940 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1d950 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
1d960 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d970 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
1d980 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1d990 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
1d9a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d9b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d9c0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1d9d0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
1d9e0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1da00 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
1da10 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
1da20 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
1da30 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
1da40 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
1da50 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
1da60 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52  astErrno;.  DWOR
1da70 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
1da80 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
1da90 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
1daa0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1dab0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
1dac0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1dad0 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
1dae0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
1daf0 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
1db00 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
1db10 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
1db20 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
1db30 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
1db40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
1db50 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
1db60 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
1db70 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
1db80 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
1db90 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
1dba0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
1dbb0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
1dbc0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
1dbd0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1dbe0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1dbf0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
1dc00 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
1dc10 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
1dc20 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
1dc30 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
1dc40 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
1dc50 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
1dc60 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42  ATH+2];     /* B
1dc70 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
1dc80 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
1dc90 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  me */..  int rc 
1dca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1dcb0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
1dcc0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
1dcd0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1dce0 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
1dcf0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
1dd00 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
1dd10 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
1dd20 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
1dd30 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
1dd40 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
1dd50 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1dd60 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1dd70 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
1dd80 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
1dd90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
1dda0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
1ddb0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
1ddc0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1ddd0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1dde0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
1ddf0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
1de00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1de10 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
1de20 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
1de30 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1de40 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
1de50 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
1de60 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
1de70 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
1de80 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
1de90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
1dea0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
1deb0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1dec0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1ded0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
1dee0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1def0 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
1df00 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  f..  /* Check th
1df10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
1df20 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
1df30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
1df40 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
1df50 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
1df60 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
1df70 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
1df80 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
1df90 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
1dfa0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
1dfb0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
1dfc0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
1dfd0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
1dfe0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
1dff0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
1e000 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
1e010 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
1e020 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
1e030 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
1e040 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
1e050 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
1e060 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
1e070 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
1e080 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
1e090 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
1e0a0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
1e0b0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
1e0c0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
1e0d0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
1e0e0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
1e0f0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
1e100 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
1e110 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
1e120 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
1e130 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
1e140 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
1e150 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1e160 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
1e170 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
1e180 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
1e190 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1e1a0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1e1b0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1e1c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
1e1d0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1e1e0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1e1f0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1e200 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1e210 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
1e220 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1e230 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1e240 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1e250 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
1e260 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
1e270 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
1e280 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1e290 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
1e2a0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
1e2b0 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
1e2c0 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
1e2d0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
1e2e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
1e2f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1e300 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
1e310 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1e320 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
1e330 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
1e340 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1e350 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
1e360 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
1e370 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
1e380 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1e390 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1e3a0 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
1e3b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1e3c0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
1e3d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1e3e0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1e3f0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
1e400 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
1e410 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
1e420 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  File!=0 );.  mem
1e430 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
1e440 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a  zeof(winFile));.
1e450 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
1e460 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1e470 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  E;..#if SQLITE_O
1e480 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 73  S_WINRT.  if( !s
1e490 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1e4a0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
1e4b0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1e4c0 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22  ERROR,.        "
1e4d0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1e4e0 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20  ectory variable 
1e4f0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f  should be set fo
1e500 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23  r WinRT");.  }.#
1e510 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1e520 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1e530 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1e540 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
1e550 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
1e560 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1e570 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
1e580 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
1e590 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
1e5a0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1e5b0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 6d  nJournal);.    m
1e5c0 65 6d 73 65 74 28 7a 54 6d 70 6e 61 6d 65 2c 20  emset(zTmpname, 
1e5d0 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a  0, MAX_PATH+2);.
1e5e0 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
1e5f0 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c  name(MAX_PATH+2,
1e600 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
1e610 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e620 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1e630 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e640 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
1e650 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
1e660 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
1e670 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
1e680 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
1e690 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
1e6a0 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
1e6b0 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
1e6c0 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
1e6d0 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
1e6e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
1e6f0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20  _parameter()..  
1e700 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54  */.  assert( (eT
1e710 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1e720 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c  _MAIN_DB) || (fl
1e730 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1e740 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20  N_URI) ||.      
1e750 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c    zUtf8Name[strl
1e760 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  en(zUtf8Name)+1]
1e770 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
1e780 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
1e790 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
1e7a0 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
1e7b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1e7c0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e7d0 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
1e7e0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1e7f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1e800 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e810 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
1e820 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
1e830 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1e840 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1e850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1e860 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
1e870 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
1e880 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1e890 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1e8a0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1e8b0 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1e8c0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1e8d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
1e8e0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
1e8f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
1e900 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1e910 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
1e920 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
1e930 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72  file is .  ** cr
1e940 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
1e950 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
1e960 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
1e970 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a  ive access" .  *
1e980 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
1e990 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
1e9a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
1e9b0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
1e9c0 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
1e9d0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
1e9e0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1e9f0 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
1ea00 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
1ea10 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
1ea20 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
1ea30 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
1ea40 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
1ea50 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
1ea60 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
1ea70 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
1ea80 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
1ea90 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
1eaa0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1eab0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
1eac0 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
1ead0 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
1eae0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
1eaf0 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
1eb00 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1eb10 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
1eb20 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
1eb30 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
1eb40 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
1eb50 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
1eb60 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
1eb70 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1eb80 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
1eb90 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1eba0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1ebb0 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
1ebc0 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
1ebd0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1ebe0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1ebf0 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
1ec00 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
1ec30 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
1ec60 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
1ec70 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
1ec80 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
1ec90 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1eca0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ecb0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
1ecc0 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
1ecd0 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
1ece0 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
1ecf0 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
1ed00 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
1ed10 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
1ed20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
1ed30 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
1ed40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1ed50 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1ed60 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
1ed70 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
1ed80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
1ed90 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
1eda0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1edb0 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
1edc0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1edd0 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
1ede0 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
1edf0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
1ee00 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
1ee10 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
1ee20 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
1ee30 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
1ee40 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
1ee50 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
1ee60 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
1ee70 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
1ee80 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
1ee90 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1eea0 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
1eeb0 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
1eec0 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
1eed0 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
1eee0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1eef0 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
1ef00 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
1ef10 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
1ef20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1ef30 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
1ef40 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
1ef50 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1ef60 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
1ef70 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
1ef80 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
1ef90 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
1efa0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1efb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1efd0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1f000 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1f030 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65                &e
1f060 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1f070 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  s))==INVALID_HAN
1f080 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79             retry
1f0b0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1f0c0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1f0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
1f0e0 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65  p */.    }.#else
1f0f0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1f100 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
1f110 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1f120 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1f150 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
1f180 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1f1b0 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
1f1e0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
1f1f0 20 20 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 4e 55 4c 4c 29             NULL)
1f210 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
1f220 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
1f250 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1f260 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1f270 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
1f280 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
1f290 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1f2a0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1f2b0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
1f2c0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
1f2d0 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
1f2e0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
1f310 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f330 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
1f340 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f360 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1f370 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1f3a0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1f3b0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
1f3e0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1f3f0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1f420 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f440 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1f450 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67    }.#endif.  log
1f460 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f  Ioerr(cnt);..  O
1f470 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
1f480 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
1f490 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
1f4a0 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
1f4b0 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
1f4c0 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
1f4d0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
1f4e0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
1f4f0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
1f500 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1f510 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1f520 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
1f530 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
1f540 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1f550 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
1f560 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
1f570 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
1f580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f590 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1f5a0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1f5b0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
1f5c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f5d0 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
1f5e0 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
1f5f0 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
1f600 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f610 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) &.            
1f620 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54           ~(SQLIT
1f630 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
1f640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1f650 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20  ITE)),.         
1f660 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
1f670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1f680 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1f690 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
1f6a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
1f6b0 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
1f6c0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1f6d0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
1f6e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1f6f0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
1f700 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
1f710 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1f720 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1f730 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1f740 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
1f750 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
1f760 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1f770 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
1f780 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
1f790 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
1f7a0 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
1f7b0 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f  TE_OK.  ){.    o
1f7c0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
1f7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f7e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1f7f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f800 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
1f810 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
1f820 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
1f830 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
1f840 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1f850 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1f860 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a  onverted);.  }..
1f870 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
1f880 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
1f890 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
1f8a0 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
1f8b0 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
1f8c0 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
1f8d0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1f8e0 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
1f8f0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
1f900 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1f910 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
1f920 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
1f930 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
1f940 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1f950 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
1f960 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
1f970 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
1f980 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
1f990 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
1f9a0 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20    pFile->hMap = 
1f9b0 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  NULL;.  pFile->p
1f9c0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
1f9d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f9e0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
1f9f0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1fa00 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
1fa10 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
1fa20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1fa30 4d 6d 61 70 3b 0a 0a 20 20 4f 70 65 6e 43 6f 75  Mmap;..  OpenCou
1fa40 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
1fa50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fa60 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
1fa70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
1fa80 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64  e that Windows d
1fa90 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
1faa0 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
1fab0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1fac0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
1fad0 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
1fae0 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
1faf0 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
1fb00 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
1fb10 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1fb20 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
1fb30 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
1fb40 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
1fb50 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
1fb60 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
1fb70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1fb80 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
1fb90 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
1fba0 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
1fbb0 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
1fbc0 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
1fbd0 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
1fbe0 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
1fbf0 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
1fc00 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
1fc10 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
1fc20 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
1fc30 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
1fc40 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
1fc50 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
1fc60 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
1fc70 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1fc80 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73  t winDelete(.  s
1fc90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1fca0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
1fcb0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
1fcc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fcd0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
1fce0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
1fcf0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
1fd00 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1fd20 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
1fd30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74   */.){.  int cnt
1fd40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1fd50 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
1fd60 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1fd70 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1fd80 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
1fd90 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1fda0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1fdb0 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
1fdc0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
1fdd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1fde0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43  RR_DELETE);.  zC
1fdf0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1fe00 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1fe10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1fe20 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1fe30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1fe40 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1fe50 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
1fe60 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69  ) ){.    do {.#i
1fe70 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1fe80 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49  T.      WIN32_FI
1fe90 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
1fea0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
1feb0 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1fec0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1fed0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1fee0 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c     if ( osGetFil
1fef0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a  eAttributesExW(z
1ff00 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69  Converted, GetFi
1ff10 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
1ff20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20      &sAttrData) 
1ff50 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
1ff60 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
1ff70 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
1ff80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ff90 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
1ffa0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1ffb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
1ffc0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
1ffd0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
1ffe0 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
1fff0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
20000 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
20010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20020 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
20030 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
20040 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
20050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20060 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
20070 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
20080 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20090 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
200a0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
200b0 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
200c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
200d0 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  if.      if ( at
200e0 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
200f0 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
20100 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
20110 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
20120 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
20130 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
20140 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
20150 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
20160 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
20170 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
20180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
20190 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
201a0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
201b0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
201c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
201d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
201e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
201f0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
20200 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20210 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
20220 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
20230 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
20240 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20250 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
20260 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
20270 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20280 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
20290 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leW(zConverted) 
202a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
202b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
202c0 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
202d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
202e0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
202f0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
20300 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
20310 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20320 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
20330 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
20340 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
20350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
20360 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66  hile(1);.  }.#if
20370 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
20380 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
20390 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
203a0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
203b0 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f  eAttributesA(zCo
203c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
203d0 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
203e0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
203f0 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
20400 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
20410 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
20420 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
20430 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
20440 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
20450 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
20460 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
20470 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
20480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
20490 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
204a0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
204b0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
204c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
204d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
204e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
204f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20500 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
20510 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
20520 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
20530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20540 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
20550 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
20560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20570 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
20580 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
20590 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
205a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
205b0 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
205c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
205d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
205e0 20 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72   if ( !retryIoer
205f0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
20600 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
20610 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20620 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
20630 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
20640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20650 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
20660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
20670 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54   rc && rc!=SQLIT
20680 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
20690 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  OENT ){.    rc =
206a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
206b0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
206c0 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  , lastErrno,.   
206d0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65            "winDe
206e0 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
206f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20700 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
20710 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
20720 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
20730 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
20740 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20  E \"%s\" %s\n", 
20750 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f  zFilename, (rc ?
20760 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
20770 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   )));.  return r
20780 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
20790 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  k the existence 
207a0 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
207b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
207c0 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
207d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
207e0 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
207f0 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
20800 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20810 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
20820 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20830 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
20840 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
20850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
20860 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
20870 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
20880 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208a0 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
208b0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
208c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
208d0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
208e0 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  o;.  void *zConv
208f0 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
20900 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
20910 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
20920 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
20930 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
20940 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   );.  zConverted
20950 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
20960 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
20970 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
20980 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
20990 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
209a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
209b0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
209c0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
209d0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
209e0 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
209f0 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
20a00 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
20a10 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
20a20 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
20a30 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
20a40 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
20a50 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
20a60 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
20a90 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
20ac0 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  ) && retryIoerr(
20ad0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
20ae0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
20af0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
20b00 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
20b10 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
20b20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
20b30 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
20b40 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
20b50 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
20b60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
20b70 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
20b80 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
20b90 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
20ba0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
20bb0 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
20bc0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
20bd0 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
20be0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
20bf0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
20c00 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
20c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
20c20 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
20c30 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
20c40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20c50 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72  e{.      logIoer
20c60 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
20c70 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
20c80 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
20c90 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  D && lastErrno!=
20ca0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
20cb0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
20cc0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20cd0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
20ce0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
20cf0 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61  Access", zFilena
20d00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
20d10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
20d20 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72  rted);.        r
20d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
20d40 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
20d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20d60 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
20d70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
20d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20d90 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20da0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
20db0 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20   else{.    attr 
20dc0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
20dd0 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
20de0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
20df0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
20e00 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
20e10 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
20e20 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
20e30 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
20e40 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
20e50 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
20e60 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
20e70 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
20e80 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
20e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
20ea0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
20eb0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
20ec0 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
20ed0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
20ee0 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ES &&.          
20ef0 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f     (attr & FILE_
20f00 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
20f10 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
20f20 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
20f30 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
20f40 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
20f50 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
20f60 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
20f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20f80 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK;.}.../*.** Re
20f90 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
20fa0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
20fb0 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
20fc0 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
20fd0 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
20fe0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
20ff0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
21000 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
21010 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
21020 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
21030 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
21040 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
21050 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
21060 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
21070 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
21080 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
21090 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
210a0 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
210b0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
210c0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
210d0 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
210e0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
210f0 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
21100 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
21110 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
21120 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
21130 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
21140 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
21150 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
21160 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
21170 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
21180 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
21190 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
211a0 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
211b0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
211c0 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
211d0 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
211e0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
211f0 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
21200 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
21210 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
21220 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
21230 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
21240 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
21250 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
21260 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
21270 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
21280 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zPathname[0]=='/
21290 27 20 7c 7c 20 7a 50 61 74 68 6e 61 6d 65 5b 30  ' || zPathname[0
212a0 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 72  ]=='\\' ){.    r
212b0 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
212c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
212d0 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
212e0 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72  ts with a letter
212f0 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20   and a colon it 
21300 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75  is either a volu
21310 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  me.  ** relative
21320 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f   path or an abso
21330 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c  lute path.  Call
21340 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
21350 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20  tion must not.  
21360 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72  ** attempt to tr
21370 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61  eat it as a rela
21380 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28  tive path name (
21390 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64  i.e. they should
213a0 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a   simply use.  **
213b0 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20   it verbatim).. 
213c0 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74   */.  if ( sqlit
213d0 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
213e0 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
213f0 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a  name[1]==':' ){.
21400 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
21410 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
21420 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
21430 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
21440 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
21450 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
21460 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
21470 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
21480 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
21490 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
214a0 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
214b0 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
214c0 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
214d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
214e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
214f0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
21500 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
21510 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
21520 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
21530 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
21540 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
21550 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
21560 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
21570 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
21580 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
21590 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
215a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
215b0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
215c0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
215d0 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
215e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
215f0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
21600 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
21610 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
21620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21630 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
21640 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
21650 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
21680 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65   */.){.  .#if de
21690 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
216a0 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
216b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
216c0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
216d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
216e0 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
216f0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
21700 65 3e 3d 4d 41 58 5f 50 41 54 48 20 29 3b 0a 20  e>=MAX_PATH );. 
21710 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d   assert( nFull>=
21720 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
21730 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74   );.  if ( sqlit
21740 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
21750 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
21760 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
21770 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
21780 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
21790 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
217a0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
217b0 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
217c0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
217d0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
217e0 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
217f0 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
21800 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
21810 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
21820 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
21830 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
21840 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
21850 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
21860 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
21870 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
21880 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f   a slash..    */
21890 0a 20 20 20 20 63 68 61 72 20 7a 4f 75 74 5b 4d  .    char zOut[M
218a0 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20  AX_PATH+1];.    
218b0 6d 65 6d 73 65 74 28 7a 4f 75 74 2c 20 30 2c 20  memset(zOut, 0, 
218c0 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20 20  MAX_PATH+1);.   
218d0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
218e0 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  h(CCP_POSIX_TO_W
218f0 49 4e 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49 56  IN_A|CCP_RELATIV
21900 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f  E, zRelative, zO
21910 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
21920 20 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54           MAX_PAT
21930 48 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  H+1);.    sqlite
21940 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
21950 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
21960 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
21970 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20  "%s\\%s",.      
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21990 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
219a0 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20  ctory, zOut);.  
219b0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 79 67 77 69  }else{.    cygwi
219c0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f  n_conv_path(CCP_
219d0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20  POSIX_TO_WIN_A, 
219e0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c  zRelative, zFull
219f0 2c 20 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , nFull);.  }.  
21a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21a10 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
21a20 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
21a30 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
21a40 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  T) && !defined(_
21a50 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
21a60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
21a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
21a80 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  R );.  /* WinCE 
21a90 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
21aa0 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
21ab0 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
21ac0 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20  m told. */.  /* 
21ad0 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79  WinRT has no way
21ae0 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65   to convert a re
21af0 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61  lative path to a
21b00 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20  n absolute one. 
21b10 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
21b20 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
21b30 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
21b40 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
21b50 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
21b60 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
21b70 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
21b80 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
21b90 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
21ba0 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
21bb0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
21bc0 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
21bd0 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
21be0 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
21bf0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
21c00 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
21c10 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
21c20 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
21c30 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
21c40 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
21c50 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
21c60 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
21c70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
21c80 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
21c90 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
21ca0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
21cb0 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s\\%s",.        
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21cd0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
21ce0 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  ory, zRelative);
21cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
21d00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
21d10 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
21d20 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
21d30 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
21d40 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ive);.  }.  retu
21d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
21d60 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
21d70 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
21d80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
21d90 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
21da0 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e  WIN__).  DWORD n
21db0 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
21dc0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
21dd0 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66   *zOut;..  /* If
21de0 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20   this path name 
21df0 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a  begins with "/X:
21e00 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20  ", where "X" is 
21e10 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20  any alphabetic. 
21e20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64   ** character, d
21e30 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69  iscard the initi
21e40 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20  al "/" from the 
21e50 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  pathname..  */. 
21e60 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30   if( zRelative[0
21e70 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65  ]=='/' && sqlite
21e80 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69  3Isalpha(zRelati
21e90 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74  ve[1]) && zRelat
21ea0 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ive[2]==':' ){. 
21eb0 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
21ec0 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
21ed0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
21ee0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
21ef0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
21f00 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
21f10 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
21f20 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
21f30 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
21f40 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
21f50 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
21f60 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
21f70 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
21f80 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
21f90 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
21fa0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
21fb0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
21fc0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
21fd0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
21fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21ff0 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ROR );.  if ( sq
22000 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
22010 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
22020 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
22030 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
22040 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
22050 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
22060 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
22070 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
22080 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
22090 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
220a0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
220b0 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
220c0 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
220d0 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
220e0 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
220f0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
22100 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
22110 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
22120 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
22130 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
22140 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
22150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
22160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
22170 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
22180 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
22190 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20  , "%s\\%s",.    
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
221c0 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69  rectory, zRelati
221d0 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ve);.    return 
221e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
221f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
22200 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
22210 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
22220 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
22230 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22240 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22250 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
22260 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
22270 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
22280 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
22290 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
222a0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
222b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
222c0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
222d0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
222e0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
222f0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
22320 57 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  W1", zConverted)
22330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22340 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22360 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
22370 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20  ULLPATH;.    }. 
22380 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
22390 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
223a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
223b0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
223c0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
223d0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
223e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
223f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22410 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22420 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
22430 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
22440 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
22450 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
22460 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
22470 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
22480 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
22490 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47  QLITE_ERROR, osG
224a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
224d0 65 57 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  eW2", zConverted
224e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
224f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22510 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
22520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22530 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
22540 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ATH;.    }.    s
22550 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
22560 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
22570 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
22580 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
22590 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
225a0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
225b0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
225c0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
225d0 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
225e0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
225f0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
22600 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
22610 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
22620 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
22630 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
22640 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47  QLITE_ERROR, osG
22650 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
22680 65 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  eA1", zConverted
22690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
226b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
226c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
226d0 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a  FULLPATH;.    }.
226e0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
226f0 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
22700 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
22710 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
22720 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
22730 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
22740 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22750 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22770 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
22780 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
22790 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
227a0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
227b0 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
227c0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
227d0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
227e0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
227f0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
22800 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
22830 41 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  A2", zConverted)
22840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22850 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22870 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
22880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22890 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
228a0 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  TH;.    }.    sq
228b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
228c0 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
228d0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
228e0 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
228f0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
22900 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
22910 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
22920 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
22930 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
22940 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
22950 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
22960 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
22970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22980 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
22990 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
229a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
229b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
229c0 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
229d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
229e0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
229f0 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
22a00 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
22a10 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
22a20 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
22a30 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
22a40 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
22a50 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
22a60 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
22a70 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
22a80 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
22a90 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
22aa0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
22ab0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
22ac0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
22ad0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
22ae0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
22af0 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
22b00 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
22b10 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
22b20 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
22b30 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
22b40 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
22b50 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22b60 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
22b70 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
22b80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
22b90 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
22ba0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
22bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
22bd0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
22be0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
22bf0 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
22c00 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
22c10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
22c20 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
22c30 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
22c40 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
22c50 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
22c60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
22c70 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
22c80 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
22c90 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
22ca0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
22cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
22cc0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22cd0 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
22ce0 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
22cf0 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
22d00 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
22d10 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
22d20 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
22d30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22d40 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61  R(pVfs);.  getLa
22d50 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
22d60 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
22d70 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73  f, zBufOut);.}.s
22d80 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e  tatic void (*win
22d90 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
22da0 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48  s *pVfs,void *pH
22db0 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79  ,const char *zSy
22dc0 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55  m))(void){.  UNU
22dd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
22de0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  fs);.  return (v
22df0 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47  oid(*)(void))osG
22e00 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
22e10 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29  HANDLE)pH, zSym)
22e20 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
22e30 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
22e40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
22e50 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
22e60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22e70 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
22e80 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
22e90 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
22ea0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
22eb0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
22ec0 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
22ed0 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
22ee0 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
22ef0 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
22f00 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
22f10 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
22f20 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
22f30 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ndif.../*.** Wri
22f40 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
22f50 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
22f60 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
22f70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
22f80 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
22f90 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
22fa0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
22fb0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
22fc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
22fd0 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65  ER(pVfs);.#if de
22fe0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
22ff0 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  T).  n = nBuf;. 
23000 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
23010 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
23020 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
23030 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
23040 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
23050 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
23060 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
23070 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
23080 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
23090 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
230a0 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f(x);.  }.  if( 
230b0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
230c0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
230d0 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75  RD pid = osGetCu
230e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
230f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
23100 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
23110 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
23120 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
23130 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
23140 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
23150 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29  izeof(ULONGLONG)
23160 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
23170 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
23180 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
23190 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
231a0 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
231b0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
231c0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
231d0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  );.  }.#else.  i
231e0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
231f0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
23200 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65  DWORD cnt = osGe
23210 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
23220 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
23230 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
23240 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
23250 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
23260 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69  .#endif.  if( si
23270 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
23280 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
23290 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
232a0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
232b0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
232c0 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
232d0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
232e0 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
232f0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
23300 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
23310 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
23320 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
23330 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
23340 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
23350 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
23360 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
23370 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
23380 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
23390 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sec){.  sqlite3_
233a0 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63  win32_sleep((mic
233b0 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
233c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
233d0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
233e0 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
233f0 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
23400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
23410 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
23420 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
23430 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
23440 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
23450 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
23460 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
23470 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
23480 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
23490 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
234a0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
234b0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
234c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
234d0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
234e0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
234f0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
23500 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
23510 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
23520 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
23530 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
23540 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
23550 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
23560 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
23570 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
23580 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
23590 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
235a0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
235b0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
235c0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
235d0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
235e0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
235f0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
23600 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
23610 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
23620 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
23630 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
23640 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
23650 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
23660 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
23670 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
23680 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
23690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
236a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
236b0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
236c0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
236d0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
236e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
236f0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
23700 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23710 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
23720 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
23730 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
23740 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
23750 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
23760 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
23770 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
23780 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
23790 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
237a0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
237b0 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
237c0 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
237d0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
237e0 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
237f0 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
23800 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
23810 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
23820 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23830 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
23840 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
23850 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
23860 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
23870 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
23880 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
23890 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
238a0 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
238b0 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
238c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
238d0 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
238e0 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
238f0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
23900 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
23910 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
23920 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  +.      (sqlite3
23930 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36  _int64)294967296
23940 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
23950 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
23960 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65  IME time;.  osGe
23970 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
23980 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
23990 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
239a0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
239b0 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
239c0 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d  if (!osSystemTim
239d0 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
239e0 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
239f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23a00 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73  ;.  }.#else.  os
23a10 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
23a20 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
23a30 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77  #endif..  *piNow
23a40 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70   = winFiletimeEp
23a50 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20  och +.          
23a60 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e    ((((sqlite3_in
23a70 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74  t64)ft.dwHighDat
23a80 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56  eTime)*max32BitV
23a90 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20  alue) + .       
23aa0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
23ab0 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44  _int64)ft.dwLowD
23ac0 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65  ateTime)/(sqlite
23ad0 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a  3_int64)10000;..
23ae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23af0 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
23b00 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
23b10 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
23b20 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
23b30 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
23b40 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
23b50 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
23b60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
23b70 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
23b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23b90 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
23ba0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
23bb0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
23bc0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
23bd0 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
23be0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
23bf0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
23c00 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
23c10 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
23c20 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
23c30 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
23c40 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
23c50 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
23c60 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
23c70 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
23c80 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
23c90 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ow){.  int rc;. 
23ca0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
23cb0 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72  ;.  rc = winCurr
23cc0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
23cd0 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72  s, &i);.  if( !r
23ce0 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  c ){.    *prNow 
23cf0 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
23d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64  .}../*.** The id
23d20 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ea is that this 
23d30 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c  function works l
23d40 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ike a combinatio
23d50 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45  n of.** GetLastE
23d60 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61  rror() and Forma
23d70 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69  tMessage() on Wi
23d80 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20  ndows (or errno 
23d90 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f  and.** strerror_
23da0 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66  r() on Unix). Af
23db0 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ter an error is 
23dc0 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f  returned by an O
23dd0 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53  S.** function, S
23de0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
23df0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a   function with z
23e00 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a  Buf pointing to.
23e10 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e  ** a buffer of n
23e20 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f  Buf bytes. The O
23e30 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70  S layer should p
23e40 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62  opulate the.** b
23e50 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c  uffer with a nul
23e60 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
23e70 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20  8 encoded error 
23e80 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72  message.** descr
23e90 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49  ibing the last I
23ea0 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  O error to have 
23eb0 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20  occurred within 
23ec0 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
23ed0 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
23ee0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
23ef0 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
23f00 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
23f10 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
23f20 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
23f30 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
23f40 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
23f50 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
23f60 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
23f70 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
23f80 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
23f90 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
23fa0 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
23fb0 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
23fc0 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
23fd0 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
23fe0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
23ff0 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
24000 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
24010 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
24020 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
24030 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
24040 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
24050 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
24060 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
24070 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
24080 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
24090 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
240a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
240b0 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
240c0 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
240d0 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
240e0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
240f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24100 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
24110 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
24120 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
24130 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
24140 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
24150 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
24160 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
24170 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
24180 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
24190 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
241a0 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
241b0 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
241c0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
241d0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
241e0 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
241f0 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
24200 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
24210 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
24220 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
24230 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
24240 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
24250 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
24260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24270 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
24280 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
24290 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
242a0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  , nBuf, zBuf);.}
242b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
242c0 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c  ze and deinitial
242d0 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
242e0 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
242f0 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
24300 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
24310 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
24320 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20  e3_vfs winVfs = 
24330 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
24340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
24350 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
24360 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
24370 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
24380 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20  /.    MAX_PATH, 
24390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
243a0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
243b0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
243c0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
243d0 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20  .    "win32",   
243e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
243f0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24410 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
24420 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
24430 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
24440 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
24450 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
24460 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
24470 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
24480 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
24490 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
244a0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
244b0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
244c0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
244d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
244e0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
244f0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
24500 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
24510 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
24520 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
24530 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
24540 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
24550 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
24560 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
24570 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
24580 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
24590 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
245a0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
245b0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
245c0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
245d0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
245e0 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
245f0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
24600 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
24610 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
24620 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
24630 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
24640 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
24650 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
24660 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
24670 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
24680 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
24690 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
246a0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
246b0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
246c0 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62  .  };..  /* Doub
246d0 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
246e0 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
246f0 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
24700 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
24710 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
24720 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
24730 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
24740 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
24750 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b 0a  Syscall)==74 );.
24760 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
24770 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
24780 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
24790 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
247a0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
247b0 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
247c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
247d0 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
247e0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
247f0 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
24800 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
24810 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
24820 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
24830 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
24840 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
24850 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
24860 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
24870 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
24880 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
24890 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
248a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
248b0 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c  _OK; .}..int sql
248c0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
248d0 29 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ){ .#if SQLITE_O
248e0 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c  S_WINRT.  if( sl
248f0 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a  eepObj!=NULL ){.
24900 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
24910 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20  e(sleepObj);.   
24920 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
24930 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
24940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24950 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
24960 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.