/ Hex Artifact Content
Login

Artifact 673b3e3d1fa3040d8d95a7f1f5e0e553aed56cfb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1360: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1370: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1390: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
13a0: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
13b0: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
13c0: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
13d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13e0: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
13f0: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
1400: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
1410: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1420: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
1430: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
1440: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1450: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
1460: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1470: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1480: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1490: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
14a0: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
14b0: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
14c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
14d0: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
14e0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
14f0: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1500: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1510: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1520: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1530: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1540: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1550: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
1560: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
1570: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
1580: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1590: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
15a0: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
15b0: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
15c0: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
15d0: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
15e0: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
15f0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
1600: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1610: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
1620: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1630: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
1640: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
1650: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
1660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1670: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
1680: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1690: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
16a0: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
16b0: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
16c0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
16d0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
16e0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
16f0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1700: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1710: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
1720: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
1730: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
1740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1750: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1760: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
1770: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
1780: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1790: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
17a0: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
17b0: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
17c0: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
17d0: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
17e0: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
17f0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1800: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1810: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1820: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1830: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
1840: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1850: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1860: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
1870: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
1880: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
1890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
18a0: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
18b0: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
18c0: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
18d0: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
18e0: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
18f0: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
1900: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1910: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
1920: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
1930: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
1940: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
1950: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
1960: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
1970: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
1980: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
1990: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
19a0: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
19b0: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
19c0: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
19d0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
19e0: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
19f0: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
1a00: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
1a10: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
1a20: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
1a30: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
1a40: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
1a50: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1aa0: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
1ab0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
1ac0: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
1ad0: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
1ae0: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
1af0: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
1b00: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
1b10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
1b20: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
1b30: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
1b40: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
1b50: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
1b60: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
1b70: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
1b80: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
1b90: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
1ba0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
1bb0: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
1bc0: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
1bd0: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
1be0: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
1bf0: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
1c00: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
1c10: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
1c20: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
1c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c70: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
1c80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1c90: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
1ca0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1cb0: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
1cc0: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
1cd0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
1ce0: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
1cf0: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
1d00: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
1d10: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
1d20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1d30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
1d40: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
1d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
1d70: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
1d80: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_SIZE) * \.   
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
1dc0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
1dd0: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
1de0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
1df0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
1e00: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
1e10: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
1e20: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
1e30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1e40: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1e50: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
1e60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1e70: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
1e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1e90: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
1ea0: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
1eb0: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
1ec0: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
1ed0: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
1ee0: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
1ef0: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
1f00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1f10: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
1f20: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1f30: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
1f40: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
1f50: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d  /*.** The winMem
1f60: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73  Data structure s
1f70: 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tores informatio
1f80: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  n required by th
1f90: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
1fa0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  .** sqlite3_mem_
1fb0: 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e  methods implemen
1fc0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
1fd0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ef struct winMem
1fe0: 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b  Data winMemData;
1ff0: 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61  .struct winMemDa
2000: 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ta {.#ifndef NDE
2010: 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 3b  BUG.  u32 magic;
2020: 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d      /* Magic num
2030: 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74  ber to detect st
2040: 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2050: 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  on. */.#endif.  
2060: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a  HANDLE hHeap; /*
2070: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f   The handle to o
2080: 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f  ur heap. */.  BO
2090: 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44  OL bOwned;  /* D
20a0: 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61  o we own the hea
20b0: 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20  p (i.e. destroy 
20c0: 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f  it on shutdown)?
20d0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20   */.};..#ifndef 
20e0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57  NDEBUG.#define W
20f0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20 20  INMEM_MAGIC     
2100: 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64 69  0x42b2830b.#endi
2110: 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  f..static struct
2120: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f   winMemData win_
2130: 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66  mem_data = {.#if
2140: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49  ndef NDEBUG.  WI
2150: 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e 64  NMEM_MAGIC,.#end
2160: 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45  if.  NULL, FALSE
2170: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .};..#ifndef NDE
2180: 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  BUG.#define winM
2190: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
21a0: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
21b0: 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d  data.magic==WINM
21c0: 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73 65  EM_MAGIC ).#else
21d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
21e0: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
21f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
2200: 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77 69 6e  MemGetHeap() win
2210: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
2220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2230: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
2240: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
2250: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
2260: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
2270: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2280: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2290: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
22a0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
22b0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
22c0: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
22d0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
22e0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
22f0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
2300: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
2310: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
2320: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
2330: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
2340: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
2350: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
2360: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
2370: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
2380: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
2390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
23a0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
23b0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
23c0: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
23d0: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
23e0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
23f0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
2400: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2410: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
2420: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
2430: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2440: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
2450: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
2460: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
2470: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
2480: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
2490: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
24a0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
24b0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
24c0: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
24d0: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
24e0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
24f0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
2500: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
2510: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
2520: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
2530: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
2540: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
2550: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ic int sqlite3_o
2560: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64  s_type = 0;.#end
2570: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43  if..#ifndef SYSC
2580: 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59  ALL.#  define SY
2590: 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79  SCALL sqlite3_sy
25a0: 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66  scall_ptr.#endif
25b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25c0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61  ction is not ava
25d0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
25e0: 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20  s CE or WinRT.. 
25f0: 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
2600: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
2610: 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65  E_OS_WINRT.#  de
2620: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
2630: 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31  isANSI()       1
2640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
2650: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2660: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
2670: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
2680: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
2690: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
26a0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
26b0: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
26c0: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
26d0: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
26e0: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
26f0: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2700: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2710: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2720: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2730: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2740: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2750: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2760: 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  win_syscall {.  
2770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2790: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
27a0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
27b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
27c0: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
27d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
27e0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
27f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2800: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2810: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2820: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2830: 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c  l[] = {.#if !SQL
2840: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2850: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2860: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
2870: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
2880: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
2890: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
28a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
28b0: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
28c0: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
28d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
28f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
2900: 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ef osAreFileApis
2910: 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41  ANSI.#define osA
2920: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28  reFileApisANSI (
2930: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56  (BOOL(WINAPI*)(V
2940: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  OID))aSyscall[0]
2950: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
2960: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
2970: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2980: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2990: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
29a0: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
29b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29c0: 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20  )CharLowerW,    
29d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
29e0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f  else.  { "CharLo
29f0: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
2a00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2a30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2a40: 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52  rLowerW ((LPWSTR
2a50: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2a60: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2a70: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2a80: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2a90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2aa0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2ab0: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2ad0: 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72  YSCALL)CharUpper
2ae0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
2af0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2b00: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
2b10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2b40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2b50: 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28   osCharUpperW ((
2b60: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
2b70: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
2b80: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2b90: 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22   { "CloseHandle"
2ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2bb0: 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64  YSCALL)CloseHand
2bc0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2bd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
2be0: 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f  CloseHandle ((BO
2bf0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
2c00: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  LE))aSyscall[3].
2c10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2c20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2c30: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
2c40: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2c60: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2c70: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
2c80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2c90: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
2ca0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2cc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2cd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2ce0: 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28  osCreateFileA ((
2cf0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2d00: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  LPCSTR,DWORD,DWO
2d10: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2d20: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2d30: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
2d40: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
2d50: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [4].pCurrent)..#
2d60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2d70: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
2d80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2d90: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2da0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2dc0: 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  eateFileW,      
2dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2de0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2df0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
2e00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2e30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2e40: 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57  FileW ((HANDLE(W
2e50: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
2e60: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
2e70: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
2e80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
2e90: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
2ea0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51  rrent)..#if (!SQ
2ec0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2ed0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2ee0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
2ef0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
2f00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2f10: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
2f20: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
2f30: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f40: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2f50: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
2f60: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2f70: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
2f80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2fb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2fc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28  teFileMappingA (
2fd0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2fe0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2ff0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3000: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3010: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54  WORD,DWORD,LPCST
3020: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  R))aSyscall[6].p
3030: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3040: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3050: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3060: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3070: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3080: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
3090: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
30a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
30b0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
30c0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
30d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
30e0: 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20  appingW,      0 
30f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3100: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3110: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3120: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3130: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3140: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3150: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
3160: 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngW ((HANDLE(WIN
3170: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
3180: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3190: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
31a0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
31b0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
31c0: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
31d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
31e0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
31f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3200: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3210: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
3220: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3230: 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20  reateMutexW,    
3240: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3250: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  se.  { "CreateMu
3260: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
3270: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
32b0: 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45  eMutexW ((HANDLE
32c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55  (WINAPI*)(LPSECU
32d0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
32e0: 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20  BOOL, \.        
32f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3300: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
3310: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3320: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3330: 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  I).  { "DeleteFi
3340: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
3350: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
3360: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
3370: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3380: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
3390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
33a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
33d0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
33e0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
33f0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
3400: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
3410: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3420: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3430: 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65  IDE).  { "Delete
3440: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
3450: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c      (SYSCALL)Del
3460: 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  eteFileW,       
3470: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3480: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
3490: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
34a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
34d0: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46  define osDeleteF
34e0: 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ileW ((BOOL(WINA
34f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
3500: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
3510: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3520: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
3530: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3540: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
3550: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  L)FileTimeToLoca
3560: 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  lFileTime, 0 },.
3570: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
3580: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
3590: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
35c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
35d0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
35e0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
35f0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
3600: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
3610: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
3620: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3630: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3640: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
3650: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3660: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
3670: 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  )FileTimeToSyste
3680: 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23  mTime,    0 },.#
3690: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
36a0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
36b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
36e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
36f0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
3700: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
3710: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
3720: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  *, \.        LPS
3730: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
3740: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
3750: 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c  )..  { "FlushFil
3760: 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20  eBuffers",      
3770: 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68    (SYSCALL)Flush
3780: 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20  FileBuffers,    
3790: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
37a0: 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  e osFlushFileBuf
37b0: 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41  fers ((BOOL(WINA
37c0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
37d0: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
37e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
37f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3800: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72  S_ANSI).  { "For
3810: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
3820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3830: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20  FormatMessageA, 
3840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3850: 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  lse.  { "FormatM
3860: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
3870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
38a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d  ..#define osForm
38b0: 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f  atMessageA ((DWO
38c0: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
38d0: 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  D,LPCVOID,DWORD,
38e0: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
38f0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f         DWORD,va_
3900: 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  list*))aSyscall[
3910: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
3920: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3930: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3940: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3950: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
3960: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3970: 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20  MessageW,       
3980: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3990: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
39a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
39b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
39d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
39e0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
39f0: 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ageW ((DWORD(WIN
3a00: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
3a10: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
3a20: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
3a30: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
3a40: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3a50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
3a60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3a70: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
3a80: 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  N).  { "FreeLibr
3a90: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
3aa0: 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c    (SYSCALL)FreeL
3ab0: 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20  ibrary,         
3ac0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ad0: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
3ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3af0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3b20: 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61  fine osFreeLibra
3b30: 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ry ((BOOL(WINAPI
3b40: 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73  *)(HMODULE))aSys
3b50: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
3b60: 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72  t)..  { "GetCurr
3b70: 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20  entProcessId",  
3b80: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43     (SYSCALL)GetC
3b90: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c  urrentProcessId,
3ba0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3bb0: 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ne osGetCurrentP
3bc0: 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44  rocessId ((DWORD
3bd0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3be0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3bf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3c00: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3c10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3c20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3c30: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3c40: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
3c50: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
3c60: 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20  eeSpaceA,       
3c70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3c80: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
3c90: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
3ca0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3cc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3cd0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
3ce0: 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceA ((BOOL(WINA
3cf0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57  PI*)(LPCSTR,LPDW
3d00: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  ORD,LPDWORD,LPDW
3d10: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
3d20: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
3d30: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3d40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3d50: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
3d60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d80: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3d90: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
3da0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
3db0: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
3dc0: 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceW,       0 },
3dd0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
3de0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
3df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3e20: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3e30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
3e40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3e50: 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44  (LPCWSTR,LPDWORD
3e60: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3e70: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57  , \.        LPDW
3e80: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39  ORD))aSyscall[19
3e90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3ea0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3eb0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
3ec0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3ed0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
3ee0: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
3ef0: 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20  ttributesA,     
3f00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3f10: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
3f20: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
3f30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3f50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3f60: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
3f70: 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57  butesA ((DWORD(W
3f80: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
3f90: 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75  aSyscall[20].pCu
3fa0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3fb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
3fc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3fd0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3fe0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3ff0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4000: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4010: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
4020: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4030: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4040: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4050: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4060: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4070: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4080: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4090: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
40a0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
40b0: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
40c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
40d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
40e0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
40f0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4100: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4110: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4120: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
4130: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4140: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4150: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4180: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4190: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
41a0: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
41b0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
41c0: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
41d0: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
41e0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
41f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
4200: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4210: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  RT.  { "GetFileS
4220: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
4230: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4240: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
4250: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4260: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
4270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4280: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
42b0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69  fine osGetFileSi
42c0: 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  ze ((DWORD(WINAP
42d0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f  I*)(HANDLE,LPDWO
42e0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  RD))aSyscall[23]
42f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4300: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4310: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4320: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4330: 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  I).  { "GetFullP
4340: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
4350: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
4360: 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20  llPathNameA,    
4370: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4380: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4390: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
43a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
43d0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
43e0: 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28  thNameA ((DWORD(
43f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4400: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
4410: 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61         LPSTR*))a
4420: 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72  Syscall[24].pCur
4430: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4440: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
4450: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4460: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4470: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4480: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
4490: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
44a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
44b0: 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20  lPathNameW,     
44c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44d0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
44e0: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
44f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4510: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4520: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
4530: 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57  hNameW ((DWORD(W
4540: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4550: 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a  DWORD,LPWSTR, \.
4560: 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29          LPWSTR*)
4570: 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43  )aSyscall[25].pC
4580: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
4590: 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20  tLastError",    
45a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
45b0: 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  )GetLastError,  
45c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
45d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73  #define osGetLas
45e0: 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57  tError ((DWORD(W
45f0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4600: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
4610: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4620: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4630: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23  OAD_EXTENSION).#
4640: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4650: 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
4660: 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
4670: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
4680: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
4690: 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47  ws CE. */.  { "G
46a0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
46b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
46c0: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
46d0: 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  A,         0 },.
46e0: 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f  #else.  /* All o
46f0: 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61  ther Windows pla
4700: 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65  tforms expect Ge
4710: 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74  tProcAddress() t
4720: 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41  o take.  ** an A
4730: 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72  NSI string regar
4740: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e  dless of the _UN
4750: 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f  ICODE setting */
4760: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64  .  { "GetProcAdd
4770: 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20  ressA",         
4780: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
4790: 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20  Address,        
47a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65    0 },.#endif.#e
47b0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  lse.  { "GetProc
47c0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
47d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4800: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
4810: 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41  rocAddressA ((FA
4820: 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48  RPROC(WINAPI*)(H
4830: 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20  MODULE, \.      
4840: 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61    LPCSTR))aSysca
4850: 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[27].pCurrent)
4860: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4870: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53  _WINRT.  { "GetS
4880: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
4890: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
48a0: 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  etSystemInfo,   
48b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
48c0: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
48d0: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
48e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4910: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
4920: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
4930: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
4940: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
4950: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4960: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4970: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  me",           (
4980: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
4990: 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  mTime,          
49a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
49b0: 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28  sGetSystemTime (
49c0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
49d0: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
49e0: 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65  scall[29].pCurre
49f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4a00: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47  _OS_WINCE.  { "G
4a10: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
4a20: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
4a30: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  L)GetSystemTimeA
4a40: 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  sFileTime, 0 },.
4a50: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79  #else.  { "GetSy
4a60: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
4a70: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4aa0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ab0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
4ac0: 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  eTime ((VOID(WIN
4ad0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
4ae0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
4af0: 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65  scall[30].pCurre
4b00: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4b10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4b20: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
4b30: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
4b40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4b50: 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20  GetTempPathA,   
4b60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4b70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
4b80: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
4b90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4bc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
4bd0: 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44  empPathA ((DWORD
4be0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4bf0: 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  LPSTR))aSyscall[
4c00: 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  31].pCurrent)..#
4c10: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4c20: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4c30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4c40: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
4c50: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4c70: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c90: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
4ca0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
4cb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ce0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
4cf0: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
4d00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4d10: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
4d20: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
4d30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4d40: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
4d50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
4d60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
4d70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
4d80: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4d90: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
4da0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4db0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4de0: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
4df0: 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  unt ((DWORD(WINA
4e00: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4e10: 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74  all[33].pCurrent
4e20: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4e30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4e40: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65  ANSI).  { "GetVe
4e50: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
4e60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4e70: 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20  tVersionExA,    
4e80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4e90: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
4ea0: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4eb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ee0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
4ef0: 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57  sionExA ((BOOL(W
4f00: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4f10: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
4f20: 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34  FOA))aSyscall[34
4f30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4f40: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4f60: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4f80: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4f90: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
4fa0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4fb0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4fc0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4fd0: 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[35].pCurrent)
4fe0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4ff0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
5000: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
5010: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5020: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
5030: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5040: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
5050: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5060: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5090: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
50a0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
50b0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
50c0: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
50d0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
50e0: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
50f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5100: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
5110: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
5120: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5130: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
5140: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5150: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
5160: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5170: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
51a0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
51b0: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
51c0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
51d0: 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65  scall[37].pCurre
51e0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
51f0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
5200: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5210: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
5220: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5230: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
5240: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
5250: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
5260: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  ID))aSyscall[38]
5270: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5280: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
5290: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
52a0: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
52d0: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
52e0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
52f0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
5300: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5310: 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70  ))aSyscall[39].p
5320: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
5330: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
5340: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5350: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
5360: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5370: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
5380: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
5390: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
53a0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
53b0: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
53c0: 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  40].pCurrent)..#
53d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
53e0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
53f0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
5400: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5410: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
5420: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5430: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
5440: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
5450: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5480: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
5490: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
54a0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
54b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
54c0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
54d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
54e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
54f0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5500: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5510: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
5520: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
5530: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
5540: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5550: 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20  )LoadLibraryA,  
5560: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5570: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
5580: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
5590: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
55c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
55d0: 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44  dLibraryA ((HMOD
55e0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
55f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  STR))aSyscall[42
5600: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5610: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5620: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
5630: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5640: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
5650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5660: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
5670: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
5680: 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20  ibraryW",       
5690: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
56a0: 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20  adLibraryW,     
56b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
56c0: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
56d0: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
56e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5710: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
5720: 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45  braryW ((HMODULE
5730: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
5740: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e  R))aSyscall[43].
5750: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5760: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5770: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5790: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
57a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
57b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
57c0: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
57d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
57e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5800: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5810: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
5820: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
5830: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
5840: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
5850: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5860: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5870: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
5880: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
5890: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
58a0: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
58b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
58d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
58e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
5920: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
5930: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
5940: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5950: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
5960: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
5970: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  RD))aSyscall[45]
5980: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5990: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
59a0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63  S_WINCE.  { "Loc
59b0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
59c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59d0: 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  LockFileEx,     
59e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
59f0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
5a00: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5a10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5a40: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
5a50: 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f  FileEx.#define o
5a60: 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  sLockFileEx ((BO
5a70: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5a80: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
5a90: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
5aa0: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
5ab0: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d  ED))aSyscall[46]
5ac0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5ad0: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
5ae0: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
5af0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
5b00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5b10: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d  MIT_WAL)).  { "M
5b20: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
5b30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5b40: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
5b50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b60: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
5b70: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
5b80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5bb0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
5bc0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
5bd0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
5be0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
5bf0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5c00: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5c10: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
5c20: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
5c30: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
5c40: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
5c50: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
5c60: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5c70: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
5c80: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
5c90: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
5ca0: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
5cb0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
5cc0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  t))aSyscall[48].
5cd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5ce0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
5cf0: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
5d00: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
5d10: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
5d20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
5d30: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
5d40: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
5d50: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5d60: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
5d70: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
5d80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
5d90: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
5db0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
5dc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5dd0: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
5de0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5df0: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
5e00: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5e10: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
5e20: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
5e30: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
5e40: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
5e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5e60: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
5e70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
5e80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
5e90: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
5ea0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5eb0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  LE))aSyscall[51]
5ec0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5ed0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5ee0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5ef0: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
5f00: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
5f10: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
5f20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5f30: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
5f40: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
5f50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5f80: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
5f90: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
5fa0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
5fb0: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
5fc0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
5fd0: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
5fe0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5ff0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
6000: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6010: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
6020: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
6030: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6040: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6090: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
60a0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
60b0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
60c0: 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  53].pCurrent).. 
60d0: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
60e0: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
60f0: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
6100: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
6110: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6120: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
6130: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
6140: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
6150: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
6160: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
6170: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
6180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6190: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
61a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
61b0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
61d0: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
61e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
61f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6200: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
6210: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6220: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6230: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6240: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6250: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
6260: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
6270: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6280: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6290: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
62a0: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
62b0: 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72  yscall[55].pCurr
62c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
62d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
62e0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
62f0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
6300: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
6310: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
6320: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6330: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
6340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6380: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
6390: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
63a0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
63b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
63c0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
63d0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 36  PED))aSyscall[56
63e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
63f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
6400: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
6410: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
6420: 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  { "UnmapViewOfFi
6430: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  le",         (SY
6440: 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f  SCALL)UnmapViewO
6450: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30  fFile,         0
6460: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
6470: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
6480: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6490: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
64a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
64b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
64c0: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
64d0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
64e0: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
64f0: 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74  all[57].pCurrent
6500: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
6510: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
6520: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
6530: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
6540: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6550: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
6560: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
6570: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
6580: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
6590: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
65a0: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
65b0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70  ))aSyscall[58].p
65c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
65d0: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
65e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65f0: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
6600: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6610: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
6620: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
6630: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
6640: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6650: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6660: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6670: 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74  all[59].pCurrent
6680: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6690: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
66a0: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
66b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
66c0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
66d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
66e0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
66f0: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
6700: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6730: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
6740: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
6750: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
6760: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
6770: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
6780: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
6790: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
67a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
67b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
67c0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
67d0: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
67e0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
67f0: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
6800: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6810: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6820: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
6830: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6840: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6850: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6860: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
6870: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
6880: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
6890: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
68a0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
68b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
68c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
68d0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
68e0: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
68f0: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
6900: 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20  leObjectEx,   0 
6910: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
6920: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6930: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
6940: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6950: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6960: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6970: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
6980: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
6990: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
69a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
69b0: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
69c0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
69d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
69e0: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
69f0: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
6a00: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
6a10: 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20  ePointerEx,     
6a20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6a30: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
6a40: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
6a50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6a70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6a80: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6a90: 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49  nterEx ((BOOL(WI
6aa0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41  NAPI*)(HANDLE,LA
6ab0: 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20  RGE_INTEGER, \. 
6ac0: 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e         PLARGE_IN
6ad0: 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79  TEGER,DWORD))aSy
6ae0: 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65  scall[63].pCurre
6af0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6b00: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6b10: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6b20: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6b30: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66  SCALL)GetFileInf
6b40: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6b50: 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  Ex, 0 },.#else. 
6b60: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
6b70: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
6b80: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6bb0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e  fine osGetFileIn
6bc0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
6bd0: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
6be0: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
6bf0: 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f        FILE_INFO_
6c00: 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c  BY_HANDLE_CLASS,
6c10: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53  LPVOID,DWORD))aS
6c20: 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72  yscall[64].pCurr
6c30: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6c40: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
6c50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6c60: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56  T_WAL).  { "MapV
6c70: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
6c80: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ",    (SYSCALL)M
6c90: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
6ca0: 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  App,    0 },.#el
6cb0: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
6cc0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
6cd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6d00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
6d10: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20  ewOfFileFromApp 
6d20: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6d30: 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55  )(HANDLE,ULONG,U
6d40: 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20  LONG64, \.      
6d50: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
6d60: 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[65].pCurrent)
6d70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6d80: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
6d90: 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20  eFile2",        
6da0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
6db0: 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20  eateFile2,      
6dc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6dd0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
6de0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
6df0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6e20: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
6e30: 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57  File2 ((HANDLE(W
6e40: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
6e50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6e60: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
6e70: 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
6e80: 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29  DED_PARAMETERS))
6e90: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
6ea0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6eb0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
6ec0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ed0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6ee0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63  ON).  { "LoadPac
6ef0: 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20  kagedLibrary",  
6f00: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
6f10: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c  PackagedLibrary,
6f20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6f30: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
6f40: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
6f50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6f80: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b  efine osLoadPack
6f90: 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d  agedLibrary ((HM
6fa0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6fb0: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
6fc0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6fd0: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
6fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6ff0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63  INRT.  { "GetTic
7000: 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20  kCount64",      
7010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
7020: 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20  TickCount64,    
7030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7040: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
7050: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
7060: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7090: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
70a0: 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c  Count64 ((ULONGL
70b0: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ONG(WINAPI*)(VOI
70c0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  D))aSyscall[68].
70d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
70e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
70f0: 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73   { "GetNativeSys
7100: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53  temInfo",     (S
7110: 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65  YSCALL)GetNative
7120: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
7130: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7140: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
7150: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
7160: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7170: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7180: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7190: 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
71a0: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
71b0: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
71c0: 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29    LPSYSTEM_INFO)
71d0: 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43  )aSyscall[69].pC
71e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
71f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
7200: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
7210: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7220: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
7230: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
7240: 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  tringA,      0 }
7250: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
7260: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
7270: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
7280: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
72a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
72b0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
72c0: 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gA ((VOID(WINAPI
72d0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
72e0: 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74  all[70].pCurrent
72f0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
7300: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7310: 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75  WIDE).  { "Outpu
7320: 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20  tDebugStringW", 
7330: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7340: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
7350: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7360: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7370: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
7380: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
73b0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
73c0: 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56  DebugStringW ((V
73d0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
73e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
73f0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
7400: 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61  { "GetProcessHea
7410: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  p",          (SY
7420: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73  SCALL)GetProcess
7430: 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  Heap,          0
7440: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
7450: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28  etProcessHeap ((
7460: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
7470: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
7480: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
7490: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
74a0: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
74b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
74c0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
74d0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
74e0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
74f0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
7500: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
7510: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
7520: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
7530: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7550: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7560: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
7570: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28  appingFromApp ((
7580: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
7590: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
75a0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
75b0: 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c  RIBUTES,ULONG,UL
75c0: 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61  ONG64,LPCWSTR))a
75d0: 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72  Syscall[73].pCur
75e0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
75f0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
7600: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
7610: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
7620: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
7630: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
7640: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
7650: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
7660: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
7670: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7680: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
7690: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
76a0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
76b0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
76c0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
76d0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
76e0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
76f0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
7700: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
7710: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
7720: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
7730: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
7740: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
7750: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
7760: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
7770: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
7780: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7790: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
77a0: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
77b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
77c0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
77d0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
77e0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
77f0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
7800: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
7810: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
7820: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
7830: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
7840: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
7850: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
7860: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
7870: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
7880: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
7890: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
78a0: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
78b0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
78c0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
78d0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
78e0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
78f0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
7900: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
7910: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
7920: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
7930: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
7940: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
7950: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
7960: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
7970: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
7980: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
7990: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
79a0: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
79b0: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
79c0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
79d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
79e0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
79f0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
7a00: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
7a10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
7a20: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
7a30: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
7a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
7a50: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
7a60: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
7a70: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
7a80: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
7a90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7aa0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
7ab0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7ac0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
7ad0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
7ae0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
7af0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
7b00: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
7b10: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
7b20: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
7b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7b50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7b60: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
7b70: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
7b80: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
7b90: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
7ba0: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
7bb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
7bc0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
7bd0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
7be0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
7bf0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
7c00: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
7c10: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
7c20: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
7c30: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
7c40: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
7c50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c60: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
7c70: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
7c80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
7c90: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
7ca0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7cb0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7cc0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7cd0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
7ce0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
7cf0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
7d00: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
7d10: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
7d20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7d40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
7d50: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
7d60: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
7d70: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
7d80: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
7d90: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
7da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7db0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7dc0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
7dd0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
7de0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
7df0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
7e00: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
7e10: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
7e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
7e30: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
7e40: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
7e50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
7e60: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
7e70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7e80: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
7e90: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
7ea0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
7eb0: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
7ec0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
7ed0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
7ee0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
7ef0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7f00: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
7f10: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7f20: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
7f30: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
7f40: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
7f50: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
7f60: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
7f70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7f80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
7f90: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
7fa0: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
7fb0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
7fc0: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
7fd0: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
7fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
7ff0: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
8000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
8010: 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68   int nBuf){.  ch
8020: 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54  ar zDbgBuf[SQLIT
8030: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8040: 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69  SIZE];.  int nMi
8050: 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53  n = MIN(nBuf, (S
8060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
8070: 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20  BUF_SIZE - 1)); 
8080: 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  /* may be negati
8090: 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69  ve. */.  if( nMi
80a0: 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31  n<-1 ) nMin = -1
80b0: 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76  ; /* all negativ
80c0: 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20  e values become 
80d0: 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  -1. */.  assert(
80e0: 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69   nMin==-1 || nMi
80f0: 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c  n==0 || nMin<SQL
8100: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
8110: 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65  F_SIZE );.#if de
8120: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8130: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69  32_HAS_ANSI).  i
8140: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
8150: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
8160: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
8170: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
8180: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
8190: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
81a0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
81b0: 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75  ugStringA(zDbgBu
81c0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
81d0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
81e0: 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d  ringA(zBuf);.  }
81f0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
8200: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
8210: 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a  WIDE).  memset(z
8220: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
8230: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8240: 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73  SIZE);.  if ( os
8250: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
8260: 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f  har(.          o
8270: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
8280: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
8290: 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c  _OEMCP, 0, zBuf,
82a0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c  .          nMin,
82b0: 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66   (LPWSTR)zDbgBuf
82c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
82d0: 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65  BG_BUF_SIZE/size
82e0: 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b  of(WCHAR))<=0 ){
82f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8300: 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  .  osOutputDebug
8310: 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52  StringW((LPCWSTR
8320: 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65  )zDbgBuf);.#else
8330: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
8340: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
8350: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
8360: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8370: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
8380: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
8390: 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  in);.    fprintf
83a0: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
83b0: 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65  DbgBuf);.  }else
83c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
83d0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66  derr, "%s", zBuf
83e0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
83f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8400: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73  wing routine sus
8410: 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e  pends the curren
8420: 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20  t thread for at 
8430: 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c  least ms.** mill
8440: 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20  iseconds.  This 
8450: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8460: 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70   the Win32 Sleep
8470: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
8480: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8490: 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44  INRT.static HAND
84a0: 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55  LE sleepObj = NU
84b0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64  LL;.#endif..void
84c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
84d0: 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69  leep(DWORD milli
84e0: 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51  seconds){.#if SQ
84f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8500: 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e  if ( sleepObj==N
8510: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70  ULL ){.    sleep
8520: 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76  Obj = osCreateEv
8530: 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c  entExW(NULL, NUL
8540: 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f  L, CREATE_EVENT_
8550: 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20  MANUAL_RESET,.  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59                SY
8580: 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a  NCHRONIZE);.  }.
8590: 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f    assert( sleepO
85a0: 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73  bj!=NULL );.  os
85b0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
85c0: 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20  ectEx(sleepObj, 
85d0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41  milliseconds, FA
85e0: 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  LSE);.#else.  os
85f0: 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e  Sleep(millisecon
8600: 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ds);.#endif.}../
8610: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
8620: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
8630: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
8640: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
8650: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
8660: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
8670: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
8680: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
8690: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
86a0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
86b0: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
86c0: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
86d0: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
86e0: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
86f0: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
8700: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
8710: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
8720: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
8730: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
8740: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
8750: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
8760: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
8770: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
8780: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8790: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
87a0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
87b0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
87c0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
87d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
87e0: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
87f0: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
8800: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
8810: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
8820: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
8830: 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65 66  E_OS_WINRT.# def
8840: 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a  ine isNT()  (1).
8850: 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53  #elif !defined(S
8860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
8870: 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 69  WIDE).# define i
8880: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65  sNT()  (0).#else
8890: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
88a0: 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66  NT(void){.    if
88b0: 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  ( sqlite3_os_typ
88c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  e==0 ){.      OS
88d0: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e  VERSIONINFOA sIn
88e0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
88f0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
8900: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
8910: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
8920: 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66  VersionExA(&sInf
8930: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
8940: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66  3_os_type = sInf
8950: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d  o.dwPlatformId==
8960: 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e  VER_PLATFORM_WIN
8970: 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20  32_NT ? 2 : 1;. 
8980: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
8990: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
89a0: 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  =2;.  }.#endif..
89b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
89c0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
89d0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
89e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
89f0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
8a00: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
8a10: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
8a20: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
8a30: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
8a40: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
8a50: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8a60: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8a70: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
8a80: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
8a90: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
8aa0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
8ab0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
8ac0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8ad0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8ae0: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8af0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
8b00: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8b10: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
8b20: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
8b30: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
8b40: 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c  ;.  p = osHeapAl
8b50: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
8b60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8b70: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
8b80: 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  es);.  if( !p ){
8b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
8ba0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
8bb0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c  failed to HeapAl
8bc0: 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64  loc %u bytes (%d
8bd0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
8bf0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
8c00: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
8c10: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
8c20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
8c30: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
8c40: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
8c50: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
8c60: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
8c70: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
8c80: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8c90: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8ca0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8cb0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8cc0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8cd0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8ce0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8cf0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8d10: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8d20: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
8d30: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
8d40: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8d50: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
8d60: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
8d70: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
8d80: 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73   return; /* Pass
8d90: 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70  ing NULL to Heap
8da0: 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Free is undefine
8db0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48  d. */.  if( !osH
8dc0: 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53  eapFree(hHeap, S
8dd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8de0: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
8df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
8e00: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
8e10: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
8e20: 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Free block %p (%
8e30: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
8e50: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
8e60: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
8e70: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
8e80: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
8e90: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
8ea0: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
8eb0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
8ec0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
8ed0: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
8ee0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
8ef0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
8f00: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
8f10: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8f20: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8f30: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8f40: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8f60: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8f70: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8f80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8f90: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8fa0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
8fb0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
8fc0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
8fd0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
8fe0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8ff0: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
9000: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
9010: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66  Bytes>=0 );.  if
9020: 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  ( !pPrior ){.   
9030: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
9040: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
9050: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9060: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
9070: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9080: 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63   = osHeapReAlloc
9090: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
90a0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
90b0: 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54   pPrior, (SIZE_T
90c0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20  )nBytes);.  }.  
90d0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
90e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
90f0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
9100: 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28  to %s %u bytes (
9110: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9130: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
9140: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
9150: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
9160: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9180: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9190: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
91a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
91b0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
91c0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
91d0: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
91e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
91f0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
9200: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
9210: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
9220: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
9230: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
9240: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
9250: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9260: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9270: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
9280: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
9290: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
92a0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
92b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
92c0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
92d0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
92e0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
92f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9300: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
9310: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
9320: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9330: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
9340: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9350: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
9360: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
9370: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
9380: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9390: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
93a0: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
93b0: 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25   %p (%d), heap=%
93c0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
93d0: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
93e0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
93f0: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
9400: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
9410: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
9420: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
9430: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
9440: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
9450: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
9460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9470: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
9480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
9490: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
94a0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
94b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
94c0: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
94d0: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
94e0: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
94f0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
9500: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
9510: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
9520: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
9530: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
9540: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9550: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
9560: 47 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c  GIC );..#if !SQL
9570: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9580: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9590: 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21  P_CREATE.  if( !
95a0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
95b0: 61 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65  ap ){.    pWinMe
95c0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
95d0: 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49  sHeapCreate(SQLI
95e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
95f0: 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
9620: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
9630: 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  T_SIZE,.        
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
9660: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9670: 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69  MAX_SIZE);.    i
9680: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
9690: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20  >hHeap ){.      
96a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
96b0: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
96c0: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48      "failed to H
96d0: 65 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20  eapCreate (%d), 
96e0: 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69  flags=%u, initSi
96f0: 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25  ze=%u, maxSize=%
9700: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
9710: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9720: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9730: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_FLAGS,.       
9740: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
9750: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20  HEAP_INIT_SIZE, 
9760: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9770: 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20  P_MAX_SIZE);.   
9780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
97a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
97b0: 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  Owned = TRUE;.  
97c0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
97d0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
97e0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69  .  }.#else.  pWi
97f0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9800: 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65  = osGetProcessHe
9810: 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69  ap();.  if( !pWi
9820: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9840: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9850: 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64  .        "failed
9860: 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65   to GetProcessHe
9870: 61 70 20 28 25 64 29 22 2c 20 6f 73 47 65 74 4c  ap (%d)", osGetL
9880: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
9890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
98a0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
98b0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
98c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
98d0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
98e0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
98f0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
9900: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
9910: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9920: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9930: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9940: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9950: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9960: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9970: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9980: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
9990: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
99a0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
99b0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
99c0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
99d0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
99e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
99f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
9a00: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
9a10: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
9a20: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
9a30: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
9a40: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
9a50: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
9a60: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
9a70: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
9a80: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
9a90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69  eturn;.  if( pWi
9aa0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9ab0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9ac0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9ad0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9ae0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9af0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9b00: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9b10: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9b20: 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73  ALIDATE).    ass
9b30: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
9b40: 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  ate(pWinMemData-
9b50: 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  >hHeap, SQLITE_W
9b60: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9b70: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
9b80: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  .    if( pWinMem
9b90: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a  Data->bOwned ){.
9ba0: 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61        if( !osHea
9bb0: 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d  pDestroy(pWinMem
9bc0: 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a  Data->hHeap) ){.
9bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9be0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9bf0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9c00: 70 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68  pDestroy (%d), h
9c10: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
9c30: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9c40: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
9c50: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
9c60: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
9c70: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
9c80: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
9c90: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9ca0: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
9cb0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
9cc0: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
9cd0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9ce0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
9cf0: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
9d00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
9d10: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
9d20: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
9d30: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
9d40: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
9d50: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
9d60: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
9d70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9d80: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
9d90: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
9da0: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
9db0: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
9dc0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
9dd0: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
9de0: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
9df0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
9e00: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
9e10: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
9e20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
9e30: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
9e40: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
9e50: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
9e60: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
9e70: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
9e80: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
9e90: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
9ea0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
9eb0: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
9ec0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
9ed0: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
9ee0: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
9ef0: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
9f00: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
9f10: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
9f20: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
9f30: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
9f40: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
9f50: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
9f60: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
9f70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9f80: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
9f90: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
9fa0: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
9fb0: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
9fc0: 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63  6?). .**.** Spac
9fd0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
9fe0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
9ff0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
a000: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
a010: 20 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e   LPWSTR utf8ToUn
a020: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
a030: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
a040: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
a050: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
a060: 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  e;..  nChar = os
a070: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
a080: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
a090: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
a0a0: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
a0b0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
a0c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
a0d0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
a0e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a0f0: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
a100: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
a110: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
a120: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
a130: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a140: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
a150: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a160: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
a170: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
a180: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
a1b0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
a1c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a1d0: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
a1e0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
a1f0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
a200: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
a210: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a220: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
a230: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
a240: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
a250: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
a260: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
a270: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
a280: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
a290: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
a2a0: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
a2b0: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
a2c0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
a2d0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
a2e0: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
a2f0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a300: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
a310: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
a320: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
a330: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a340: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a350: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
a360: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a370: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
a380: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
a390: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a3a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
a3b0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a3c0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
a3d0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
a3e0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
a3f0: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
a420: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a430: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a440: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
a450: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
a460: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a470: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
a480: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
a490: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20   ANSI string to 
a4a0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
a4b0: 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  e, based on the.
a4c0: 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  ** current codep
a4d0: 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72  age settings for
a4e0: 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a   file apis..** .
a4f0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a500: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a510: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a520: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
a530: 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74  _malloc..*/.stat
a540: 69 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f  ic LPWSTR mbcsTo
a550: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
a560: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
a570: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
a580: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
a590: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
a5a0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
a5b0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a5c0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
a5d0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
a5e0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a5f0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
a600: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
a610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
a640: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
a650: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a660: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
a670: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
a680: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
a690: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
a6a0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
a6b0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
a6c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a6d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
a6e0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
a6f0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
a700: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
a710: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
a720: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
a750: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
a760: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a770: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
a780: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
a790: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
a7a0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
a7b0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
a7c0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
a7d0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
a7e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
a7f0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
a800: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
a810: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
a820: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a830: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a840: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a850: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
a860: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
a870: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
a880: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
a890: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
a8a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
a8b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
a8c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
a8d0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
a8e0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a8f0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
a900: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
a910: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
a920: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
a930: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
a940: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
a950: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a970: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
a980: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
a990: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
a9a0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
a9b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a9c0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
a9d0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
a9e0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
a9f0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
aa00: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
aa30: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
aa40: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
aa50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
aa60: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
aa70: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
aa80: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
aa90: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
aaa0: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
aab0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
aac0: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
aad0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
aae0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
aaf0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ab00: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
ab10: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
ab20: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
ab30: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
ab40: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
ab50: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
ab60: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
ab70: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
ab80: 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55  mpWide = mbcsToU
ab90: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
aba0: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
abb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
abc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
abd0: 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63  enameUtf8 = unic
abe0: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
abf0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
ac00: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
ac10: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
ac20: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
ac30: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
ac40: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
ac50: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
ac60: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
ac70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
ac80: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
ac90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
aca0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
acb0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
acc0: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
acd0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ace0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
acf0: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53  nameMbcs;.  LPWS
ad00: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
ad10: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
ad20: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
ad30: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
ad40: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
ad50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
ad60: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
ad70: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
ad80: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
ad90: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
ada0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
adb0: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
adc0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
add0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
ade0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
adf0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
ae00: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
ae10: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
ae20: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
ae30: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
ae40: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
ae50: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
ae60: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
ae70: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
ae80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
ae90: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
aea0: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
aeb0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
aec0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
aed0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
aee0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
aef0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
af00: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
af10: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
af20: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
af30: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
af40: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
af50: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
af60: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
af70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
af80: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
af90: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
afa0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
afb0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
afc0: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
afd0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
afe0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
aff0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
b000: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
b010: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
b020: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
b030: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
b040: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
b050: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
b060: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
b070: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
b080: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
b090: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
b0a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
b0b0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
b0d0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
b0e0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
b0f0: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
b100: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
b110: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
b120: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
b130: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
b140: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
b150: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
b160: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
b170: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
b180: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
b190: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
b1a0: 61 6c 75 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  alueUtf8 = unico
b1b0: 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29  deToUtf8(zValue)
b1c0: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61  ;.      if ( zVa
b1d0: 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20  lueUtf8==0 ){.  
b1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b1f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
b200: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
b210: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
b220: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
b230: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
b240: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
b250: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b260: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b270: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
b280: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
b290: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
b2a0: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
b2b0: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
b2c0: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
b2d0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
b2e0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
b2f0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
b300: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
b310: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b320: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
b330: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
b340: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
b350: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
b360: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
b370: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
b380: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
b390: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
b3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
b3b0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
b3c0: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
b3d0: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
b3e0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
b3f0: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
b400: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
b410: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
b420: 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28   0;..  if( isNT(
b430: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
b440: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
b450: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58  AR zTempWide[MAX
b460: 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54  _PATH+1]; /* NOT
b470: 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69  E: Somewhat arbi
b480: 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77  trary. */.    dw
b490: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
b4a0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
b4b0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
b4c0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b4f0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
b520: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
b590: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20  MAX_PATH,.      
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65         0);.#else
b5e0: 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
b5f0: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
b600: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b610: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
b620: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
b630: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b660: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
b670: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b6a0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
b6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
b6d0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54            (LPWST
b740: 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20  R) &zTempWide,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
b790: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64  #endif.    if( d
b7a0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
b7b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
b7c0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
b7d0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
b7e0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
b7f0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b800: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69        zOut = uni
b810: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
b820: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Wide);.      sql
b830: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
b840: 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49  loc();.#if !SQLI
b850: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
b860: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
b870: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
b880: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
b890: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
b8a0: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
b8b0: 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pWide);.#endif. 
b8c0: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
b8d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b8e0: 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
b8f0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
b900: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
b910: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
b920: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
b930: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
b940: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b970: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b9a0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b9b0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
ba00: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70    (LPSTR) &zTemp
ba50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba90: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
baa0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
bab0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
bac0: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
bad0: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
bae0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
baf0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bb00: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
bb10: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
bb20: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
bb30: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bb40: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bb50: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
bb60: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
bb70: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
bb80: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
bb90: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
bba0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
bbb0: 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20  ndif.  if( 0 == 
bbc0: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
bbd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
bbe0: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
bbf0: 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c  or 0x%x (%u)", l
bc00: 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72  astErrno, lastEr
bc10: 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rno);.  }else{. 
bc20: 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78     /* copy a max
bc30: 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61  imum of nBuf cha
bc40: 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  rs to output buf
bc50: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
bc60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
bc70: 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f  , zBuf, "%s", zO
bc80: 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65  ut);.    /* free
bc90: 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72   the UTF8 buffer
bca0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
bcb0: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
bcc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bcd0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
bce0: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
bcf0: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
bd00: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
bd10: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
bd20: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
bd30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
bd40: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
bd50: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
bd60: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
bd70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
bd80: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
bd90: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
bda0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
bdb0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
bdc0: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
bdd0: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
bde0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
bdf0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
be00: 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d  from .** FormatM
be10: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
be20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
be30: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
be40: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
be50: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
be60: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
be70: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
be80: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
be90: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
bea0: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
beb0: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
bec0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
bed0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
bee0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
bef0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
bf00: 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f  led and the asso
bf10: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
bf20: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
bf30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
bf40: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
bf50: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
bf60: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
bf70: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
bf80: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
bf90: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
bfa0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
bfb0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
bfc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
bfd0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
bfe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bff0: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
c000: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
c010: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
c030: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
c040: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
c050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
c060: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
c070: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
c080: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
c090: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
c0a0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
c0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
c0c0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
c0d0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
c0e0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
c0f0: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c110: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
c120: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
c130: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c150: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c160: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
c170: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
c180: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
c190: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
c1a0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
c1b0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
c1c0: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
c1d0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
c1e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
c1f0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
c200: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
c210: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
c220: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
c230: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
c240: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
c250: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
c260: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
c270: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
c280: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
c290: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
c2a0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
c2b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
c2c0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
c2d0: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
c2e0: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
c2f0: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
c300: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
c310: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
c320: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
c330: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
c340: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
c350: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
c360: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
c370: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
c380: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
c390: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
c3a0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
c3b0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
c3c0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
c3d0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
c3e0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
c3f0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
c400: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
c410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c420: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
c430: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
c440: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
c450: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
c460: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
c470: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
c480: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c490: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
c4a0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
c4b0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
c4c0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
c4d0: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
c4e0: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
c4f0: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
c500: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
c510: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
c520: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
c530: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
c540: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
c550: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
c560: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
c570: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
c580: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
c590: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
c5a0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
c5b0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
c5c0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
c5d0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
c5e0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
c5f0: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
c600: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
c610: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
c620: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
c630: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
c640: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
c650: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
c660: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
c670: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
c680: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
c690: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
c6a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
c6b0: 32 5f 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65  2_sleep(win32Ioe
c6c0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
c6d0: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
c6e0: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
c6f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
c700: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
c710: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
c720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
c730: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
c740: 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
c750: 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
c760: 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69   void logIoerr(i
c770: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66  nt nRetry){.  if
c780: 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( nRetry ){.    
c790: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c7a0: 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20  TE_IOERR, .     
c7b0: 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66   "delayed %dms f
c7c0: 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20  or lock/sharing 
c7d0: 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20  conflict",.     
c7e0: 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
c7f0: 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
c800: 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b  etry+1)/2.    );
c810: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
c820: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
c830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
c880: 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
c890: 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
c8a0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  nly..*/.#if !def
c8b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43  ined(SQLITE_MSVC
c8c0: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20  _LOCALTIME_API) 
c8d0: 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f  || !SQLITE_MSVC_
c8e0: 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a  LOCALTIME_API./*
c8f0: 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54  .** The MSVC CRT
c900: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d   on Windows CE m
c910: 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  ay not have a lo
c920: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
c930: 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74  on.  So.** creat
c940: 65 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a  e a substitute..
c950: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
c960: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
c970: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
c980: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
c990: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
c9a0: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
c9b0: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
c9c0: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
c9d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
c9e0: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
c9f0: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
ca00: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
ca10: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
ca20: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
ca30: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
ca40: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
ca50: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
ca60: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
ca70: 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
ca80: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
ca90: 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
caa0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
cab0: 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
cac0: 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
cad0: 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
cae0: 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
caf0: 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
cb00: 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
cb10: 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
cb20: 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
cb30: 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
cb40: 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
cb50: 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
cb60: 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
cb70: 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
cb80: 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
cb90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
cba0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
cbb0: 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26  E(a) (winFile*)&
cbc0: 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74  ((char*)a)[-(int
cbd0: 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  )offsetof(winFil
cbe0: 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
cbf0: 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
cc00: 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
cc10: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
cc20: 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
cc30: 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
cc40: 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
cc50: 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57       dwErr = osW
cc60: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
cc70: 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
cc80: 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
cc90: 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
cca0: 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
ccb0: 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
ccc0: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
ccd0: 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
cce0: 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
ccf0: 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
cd00: 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
cd10: 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
cd20: 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
cd30: 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
cd40: 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
cd50: 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
cd60: 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
cd70: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
cd80: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
cd90: 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
cda0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
cdb0: 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
cdc0: 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54  *pFile){.  LPWST
cdd0: 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52  R zTok;.  LPWSTR
cde0: 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20   zName;.  DWORD 
cdf0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f  lastErrno;.  BOO
ce00: 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53  L bLogged = FALS
ce10: 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  E;.  BOOL bInit 
ce20: 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65  = TRUE;..  zName
ce30: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
ce40: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
ce50: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
ce60: 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d     /* out of mem
ce70: 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ory */.    retur
ce80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
ce90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
cea0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
ceb0: 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f  ocal lockdata */
cec0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65  .  memset(&pFile
ced0: 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65  ->local, 0, size
cee0: 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29  of(pFile->local)
cef0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65  );..  /* Replace
cf00: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73   the backslashes
cf10: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61   from the filena
cf20: 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65  me and lowercase
cf30: 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69   it.  ** to deri
cf40: 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e  ve a mutex name.
cf50: 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43   */.  zTok = osC
cf60: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
cf70: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
cf80: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
cf90: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
cfa0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
cfb0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
cfc0: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
cfd0: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
cfe0: 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65  Mutex = osCreate
cff0: 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c  MutexW(NULL, FAL
d000: 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  SE, zName);.  if
d010: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
d020: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
d030: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
d040: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
d050: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
d060: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
d070: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
d080: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
d090: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
d0a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d0b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
d0c0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d0d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
d0e0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
d0f0: 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
d100: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
d110: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
d120: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
d130: 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65  );.  .  /* Since
d140: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
d150: 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
d160: 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
d170: 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a  ppings etc are .
d180: 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74    ** case-sensit
d190: 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74  ive, take advant
d1a0: 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75  age of that by u
d1b0: 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d  ppercasing the m
d1c0: 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  utex name.  ** a
d1d0: 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73  nd using that as
d1e0: 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65   the shared file
d1f0: 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20  mapping name..  
d200: 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72  */.  osCharUpper
d210: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
d220: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43  e->hShared = osC
d230: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
d240: 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
d250: 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
d290: 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
d2a0: 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20      zName);  .. 
d2e0: 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74   /* Set a flag t
d2f0: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65  hat indicates we
d300: 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f  're the first to
d310: 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f   create the memo
d320: 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d  ry so it .  ** m
d330: 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
d340: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
d350: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
d360: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
d370: 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
d380: 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
d390: 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
d3a0: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
d3b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
d3c0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
d3d0: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
d3e0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
d3f0: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
d400: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
d410: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
d420: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
d430: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
d440: 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
d450: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
d460: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46   .             F
d470: 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
d480: 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
d490: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
d4a0: 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
d4b0: 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
d4c0: 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
d4d0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
d4e0: 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
d4f0: 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e      if( !pFile->
d500: 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  shared ){.      
d510: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d520: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d530: 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
d540: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
d550: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
d560: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
d570: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
d580: 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
d590: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
d5a0: 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
d5b0: 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
d5c0: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
d5d0: 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
d5e0: 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
d5f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d600: 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
d610: 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
d620: 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
d630: 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
d640: 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70   fail */.  if( p
d650: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e  File->hShared==N
d660: 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
d670: 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20  bLogged ){.     
d680: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d690: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
d6a0: 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
d6b0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
d6c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6e0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
d6f0: 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock3", zFilename
d700: 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
d710: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
d720: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
d730: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
d740: 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
d750: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
d760: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
d770: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
d780: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d790: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20  TE_IOERR;.  }.  
d7a0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
d7b0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d7c0: 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70  ry if we're supp
d7d0: 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28  osed to */.  if(
d7e0: 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65   bInit ){.    me
d7f0: 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72  mset(pFile->shar
d800: 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  ed, 0, sizeof(wi
d810: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a  nceLock));.  }..
d820: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
d830: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
d840: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
d850: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d860: 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72   Destroy the par
d870: 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61  t of winFile tha
d880: 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e  t deals with win
d890: 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74  ce locks.*/.stat
d8a0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73  ic void winceDes
d8b0: 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  troyLock(winFile
d8c0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28   *pFile){.  if (
d8d0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
d8e0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74      /* Acquire t
d8f0: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
d900: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
d910: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d920: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
d930: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73  llowing blocks s
d940: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61  hould probably a
d950: 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d  ssert in debug m
d960: 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20  ode, but they.  
d970: 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61       are to clea
d980: 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20  nup in case any 
d990: 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f  locks remained o
d9a0: 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  pen */.    if (p
d9b0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
d9c0: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69  ders){.      pFi
d9d0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
d9e0: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ders --;.    }. 
d9f0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
da00: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a  cal.bReserved){.
da10: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
da20: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
da30: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
da40: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
da50: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
da60: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
da70: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  d->bPending = FA
da80: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
da90: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
daa0: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
dab0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
dac0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
dad0: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ALSE;.    }..   
dae0: 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65   /* De-reference
daf0: 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63   and close our c
db00: 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65  opy of the share
db10: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
db20: 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69  */.    osUnmapVi
db30: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
db40: 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43  shared);.    osC
db50: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
db60: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20  ->hShared);..   
db70: 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68   /* Done with th
db80: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
db90: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
dba0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
dbb0: 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65      .    osClose
dbc0: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
dbd0: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
dbe0: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
dbf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  .  }.}../* .** A
dc00: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
dc10: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
dc20: 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  () API of Window
dc30: 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
dc40: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
dc50: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
dc60: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
dc70: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
dc80: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
dc90: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
dca0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
dcb0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
dcc0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
dcd0: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
dce0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
dcf0: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
dd00: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
dd10: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
dd20: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
dd30: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
dd40: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
dd50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
dd60: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
dd70: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
dd80: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
dd90: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
dda0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
ddb0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
ddc0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
ddd0: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
dde0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
ddf0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
de00: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
de10: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
de20: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
de30: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
de40: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
de50: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
de60: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
de70: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
de80: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
de90: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
dea0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
deb0: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
dec0: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
ded0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
dee0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
def0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
df00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
df10: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
df20: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
df30: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
df40: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
df50: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
df60: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
df70: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
df80: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
df90: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
dfa0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
dfb0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
dfc0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
dfd0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
dfe0: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
dff0: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
e000: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e010: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
e020: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
e030: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
e040: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
e050: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
e060: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e070: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e080: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
e090: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e0a0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e0b0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
e0c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
e0d0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
e0e0: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
e0f0: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
e100: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
e110: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
e120: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
e130: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e140: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
e150: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e160: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
e170: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
e180: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e190: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
e1a0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
e1b0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e1c0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e1d0: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
e1e0: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
e1f0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
e200: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
e210: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
e220: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
e230: 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ved == 0) {.    
e240: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e250: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  >bReserved = TRU
e260: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
e270: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
e280: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
e290: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e2a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
e2b0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
e2c0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
e2d0: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
e2e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
e2f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
e300: 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20   UnlockFile API 
e310: 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
e320: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
e330: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
e340: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
e350: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
e360: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
e370: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
e380: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
e390: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e3a0: 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
e3b0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
e3c0: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
e3d0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
e3e0: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
e3f0: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
e400: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
e410: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
e420: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
e430: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
e440: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
e450: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
e460: 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
e470: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
e480: 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
e490: 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
e4a0: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
e4b0: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
e4c0: 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
e4d0: 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
e4e0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
e4f0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
e500: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
e510: 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
e520: 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
e530: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
e540: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
e550: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
e560: 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
e570: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
e580: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e590: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
e5a0: 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
e5b0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
e5c0: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
e5d0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e5e0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
e5f0: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
e600: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
e610: 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
e620: 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
e630: 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
e640: 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
e650: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
e660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
e670: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e680: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
e690: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20  D)SHARED_SIZE.  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e             || nN
e6b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e6c0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20  lockLow == 1);. 
e6d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e6e0: 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
e6f0: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
e700: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
e710: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
e720: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e730: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
e740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e750: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
e760: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
e770: 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
e780: 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
e790: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e7a0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e7b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
e7c0: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
e7d0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e7e0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
e7f0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e800: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
e810: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e820: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
e830: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
e840: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
e850: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
e860: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e870: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c    }.  }.  /* Rel
e880: 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65  easing a reserve
e890: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  d lock */.  else
e8a0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
e8b0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
e8c0: 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
e8d0: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
e8e0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e8f0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
e900: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e910: 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20  .bReserved) {.  
e920: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e930: 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  .bReserved = FAL
e940: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e950: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
e960: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
e970: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e980: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
e990: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
e9a0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e9b0: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
e9c0: 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  n;.}./*.** End o
e9d0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
e9e0: 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
e9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
ea40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
ea50: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINCE */../*.** 
ea60: 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  Lock a file regi
ea70: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  on..*/.static BO
ea80: 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a  OL winLockFile(.
ea90: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
eaa0: 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73  e,.  DWORD flags
eab0: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
eac0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
ead0: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
eae0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
eaf0: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
eb00: 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
eb10: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
eb20: 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
eb30: 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
eb40: 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
eb50: 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
eb60: 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
eb70: 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
eb80: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  le..  */.  retur
eb90: 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  n winceLockFile(
eba0: 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
ebb0: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
ebe0: 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
ebf0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73  ;.#else.  if( is
ec00: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
ec10: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
ec20: 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
ec30: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
ec40: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
ec50: 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
ec60: 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
ec70: 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
ec80: 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
ec90: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70   osLockFileEx(*p
eca0: 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c  hFile, flags, 0,
ecb0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
ecc0: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
ecd0: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
ece0: 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
ecf0: 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
ed00: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
ed10: 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
ed40: 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
ed50: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
ed60: 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20  a file region.. 
ed70: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
ed80: 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  inUnlockFile(.  
ed90: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
eda0: 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
edb0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
edc0: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
edd0: 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
ede0: 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
edf0: 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
ee00: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
ee10: 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
ee20: 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
ee30: 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
ee40: 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
ee50: 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
ee60: 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46       API UnlockF
ee70: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
ee80: 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  rn winceUnlockFi
ee90: 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
eea0: 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
eeb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eec0: 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
eed0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
eee0: 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
eef0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
ef00: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
ef10: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
ef20: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
ef30: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
ef40: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
ef50: 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
ef60: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
ef70: 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
ef80: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
ef90: 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c  leEx(*phFile, 0,
efa0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
efb0: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
efc0: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
efd0: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
efe0: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
eff0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
f000: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
f010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f020: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
f030: 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
f040: 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dif.}../********
f050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f090: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
f0a0: 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
f0b0: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
f0c0: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
f0d0: 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
f0e0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
f0f0: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f150: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
f160: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
f170: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
f180: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef 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 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
f1b0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f1c0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
f1d0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
f1e0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
f1f0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
f200: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
f210: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f220: 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
f230: 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
f240: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
f250: 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
f260: 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
f270: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
f280: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f290: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
f2a0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
f2b0: 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  int seekWinFile(
f2c0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
f2d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
f2e0: 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c  ffset){.#if !SQL
f2f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c  ITE_OS_WINRT.  L
f300: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
f330: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
f340: 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
f350: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f360: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
f370: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
f380: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f390: 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
f3c0: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
f3d0: 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44  ter() */.  DWORD
f3e0: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
f3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f400: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f410: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
f420: 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d  /..  upperBits =
f430: 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74   (LONG)((iOffset
f440: 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
f450: 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  ff);.  lowerBits
f460: 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65   = (LONG)(iOffse
f470: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
f480: 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74  ..  /* API oddit
f490: 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  y: If successful
f4a0: 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  , SetFilePointer
f4b0: 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f  () returns a dwo
f4c0: 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  rd .  ** contain
f4d0: 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
f4e0: 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
f4f0: 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
f500: 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
f510: 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
f520: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
f530: 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
f540: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
f550: 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  DN, .  ** INVALI
f560: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
f570: 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
f580: 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
f590: 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
f5a0: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
f5b0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63   an error has ac
f5c0: 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c  tually occurred,
f5d0: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
f5e0: 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
f5f0: 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
f600: 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
f610: 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
f620: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
f630: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
f640: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
f650: 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
f660: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
f670: 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
f680: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
f690: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
f6a0: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
f6b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
f6c0: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
f6d0: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
f6e0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f6f0: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
f700: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f710: 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69        "seekWinFi
f720: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
f730: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  h);.    return 1
f740: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f750: 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  0;.#else.  /*.  
f760: 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65  ** Same as above
f770: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
f780: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
f790: 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52  n works for WinR
f7a0: 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45  T..  */..  LARGE
f7b0: 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20  _INTEGER x;     
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7d0: 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  e new offset */.
f7e0: 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20    BOOL bRet;    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
f810: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
f820: 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20  interEx() */..  
f830: 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66  x.QuadPart = iOf
f840: 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f  fset;.  bRet = o
f850: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
f860: 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30  x(pFile->h, x, 0
f870: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
f880: 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20    if(!bRet){.   
f890: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f8a0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f8b0: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
f8c0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f8d0: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
f8e0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
f8f0: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
f900: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
f910: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
f920: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
f930: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  n 0;.#endif.}..#
f940: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
f950: 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72  AP_SIZE>0./* For
f960: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
f970: 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
f980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
f990: 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
f9a0: 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
f9b0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
f9c0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
f9d0: 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
f9e0: 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
f9f0: 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
fa00: 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
fa10: 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
fa20: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
fa30: 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
fa40: 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
fa50: 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
fa60: 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
fa70: 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
fa80: 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
fa90: 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
faa0: 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
fab0: 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
fac0: 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
fad0: 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
fae0: 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
faf0: 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
fb00: 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
fb10: 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
fb20: 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
fb30: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
fb40: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
fb50: 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
fb60: 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
fb70: 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
fb80: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
fb90: 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
fba0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
fbb0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
fbc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
fbd0: 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
fbe0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
fbf0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
fc00: 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
fc10: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
fc20: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E %d\n", pFile->
fc30: 68 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  h));.  assert( p
fc40: 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26  File->h!=NULL &&
fc50: 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c   pFile->h!=INVAL
fc60: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
fc70: 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
fc80: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
fc90: 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61 70 66 69   rc = winUnmapfi
fca0: 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  le(pFile);.  if(
fcb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fcc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
fcd0: 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63  if..  do{.    rc
fce0: 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   = osCloseHandle
fcf0: 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  (pFile->h);.    
fd00: 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  /* SimulateIOErr
fd10: 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58  or( rc=0; cnt=MX
fd20: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20  _CLOSE_ATTEMPT; 
fd30: 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  ); */.  }while( 
fd40: 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c  rc==0 && ++cnt <
fd50: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
fd60: 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69  T && (sqlite3_wi
fd70: 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20  n32_sleep(100), 
fd80: 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  1) );.#if SQLITE
fd90: 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e  _OS_WINCE.#defin
fda0: 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e  e WINCE_DELETION
fdb0: 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69  _ATTEMPTS 3.  wi
fdc0: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
fdd0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69  File);.  if( pFi
fde0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
fdf0: 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
fe00: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
fe10: 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
fe20: 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
fe30: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
fe40: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
fe50: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
fe60: 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
fe70: 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
fe80: 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20  fffffff .       
fe90: 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
fea0: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
feb0: 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
fec0: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
fed0: 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20  sleep(100);  /* 
fee0: 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65  Wait a little be
fef0: 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69  fore trying agai
ff00: 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  n */.    }.    s
ff10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
ff20: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
ff30: 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
ff40: 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
ff50: 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
ff60: 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a  ->h, rc ? "ok" :
ff70: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69   "failed"));.  i
ff80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
ff90: 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  le->h = NULL;.  
ffa0: 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
ffb0: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  -1);.  return rc
ffc0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
ffd0: 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
ffe0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fff0: 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
10000 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
10030 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
10040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
10050 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
10060 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
10070 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10080 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
10090 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
100a0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
100b0 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
100c0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
100d0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
100e0 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
100f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10100 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
10110 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
10120 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10140 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
10150 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
10160 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10190 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
101a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
101b0 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
101c0 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
101d0 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
101e0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
101f0 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50  WINCE.  OVERLAPP
10200 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
10210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
10220 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69  ffset for ReadFi
10230 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  le. */.#endif.  
10240 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10250 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
10260 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* file handle *
10270 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b  /.  DWORD nRead;
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
102a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
102b0 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
102c0 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
102d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
102e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
102f0 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73   retrys */..  as
10300 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
10310 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
10320 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
10330 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
10340 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
10350 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
10360 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
10370 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
10380 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
10390 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
103a0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
103b0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
103c0 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
103d0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
103e0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
103f0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
10400 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
10410 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
10420 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
10430 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
10440 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
10450 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
10460 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
10470 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
10480 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
10490 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
104a0 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
104b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
104c0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
104d0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
104e0 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
104f0 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
10500 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
10510 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
10520 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
10530 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
10540 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
10550 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
10560 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
10570 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
10580 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
10590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
105a0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
105b0 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65  S_WINCE.  if( se
105c0 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c  ekWinFile(pFile,
105d0 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
105e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
105f0 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
10600 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
10610 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
10620 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
10630 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
10640 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
10650 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
10660 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
10670 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
10680 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
10690 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
106a0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
106b0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
106c0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
106d0 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
106e0 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
106f0 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
10700 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
10710 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
10720 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
10730 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
10740 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
10750 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10760 0a 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f  .    if( retryIo
10770 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10780 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10790 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
107a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
107b0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  Errno;.    retur
107c0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
107d0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
107e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
107f0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10800 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
10810 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
10820 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
10830 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
10840 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
10850 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
10860 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
10870 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
10880 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
10890 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
108a0 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
108b0 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ead);.    return
108c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
108d0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
108e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
108f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
10900 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
10910 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
10920 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
10930 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
10940 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
10950 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
10960 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
10970 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
10980 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
10990 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
109a0 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
109b0 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
109c0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
109d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
109e0 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
109f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
10a00 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
10a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10a20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
10a30 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
10a40 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
10a50 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
10a60 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
10a70 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
10a80 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
10a90 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
10ac0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
10ad0 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20  else false */.  
10ae0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10af0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
10b00 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* File handle *
10b10 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
10b20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10b30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10b40 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61   retries */..  a
10b50 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
10b60 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10b70 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
10b80 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
10b90 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
10ba0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
10bb0 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
10bc0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20  SQLITE_FULL);.. 
10bd0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
10be0 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20   %d lock=%d\n", 
10bf0 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
10c00 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
10c10 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
10c20 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
10c30 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
10c40 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
10c50 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
10c60 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
10c70 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
10c80 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
10c90 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
10ca0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
10cb0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
10cc0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
10cd0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
10ce0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
10cf0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
10d00 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
10d10 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
10d20 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
10d30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10d40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
10d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
10d60 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d  y = (int)(pFile-
10d70 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
10d80 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  et);.      memcp
10d90 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
10da0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
10db0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
10dc0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
10dd0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
10de0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
10df0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
10e00 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
10e10 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
10e20 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
10e30 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d  _OS_WINCE.  rc =
10e40 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
10e50 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
10e60 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
10e70 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
10e80 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
10e90 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  E.    OVERLAPPED
10ea0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
10eb0 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
10ec0 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
10ed0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
10ee0 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
10ef0 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
10f00 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
10f10 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
10f20 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
10f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10f40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
10f50 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
10f60 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
10f70 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
10f80 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
10f90 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
10fa0 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
10fb0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
10fc0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
10fd0 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
10fe0 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
10ff0 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
11000 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
11010 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  E.    memset(&ov
11020 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
11030 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11040 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
11050 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
11060 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
11070 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
11080 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
11090 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
110a0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
110b0 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
110c0 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
110d0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
110e0 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28  _WINCE.      if(
110f0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
11100 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
11110 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
11120 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
11130 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
11140 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
11150 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
11160 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
11170 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
11180 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
11190 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
111a0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
111b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
111c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
111d0 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
111e0 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
111f0 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
11200 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
11210 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
11220 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
11230 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11240 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
11250 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11260 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
11270 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
11280 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
11290 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
112a0 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
112b0 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
112c0 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
112d0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
112e0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
112f0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
11300 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
11310 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
11320 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
11330 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
11340 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
11350 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
11360 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11370 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
11380 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
11390 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
113a0 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
113b0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
113c0 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
113d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
113e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
113f0 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
11400 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11410 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
11420 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69   }.    return wi
11430 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11440 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
11450 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
11470 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e  nWrite", pFile->
11480 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
11490 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52  .    logIoerr(nR
114a0 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  etry);.  }.  ret
114b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
114c0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
114d0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
114e0 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
114f0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
11500 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
11510 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
11520 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
11530 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
11540 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11550 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
11560 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
11570 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11580 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
11590 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
115a0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
115b0 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  n */.  DWORD las
115c0 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
115d0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f  t( pFile );..  O
115e0 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
115f0 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
11600 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b  ile->h, nByte));
11610 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11620 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
11630 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
11640 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
11650 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
11660 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
11670 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
11680 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
11690 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
116a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
116b0 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
116c0 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
116d0 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
116e0 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
116f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
11700 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
11710 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
11720 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
11730 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
11740 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
11750 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
11760 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
11770 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
11780 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
11790 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
117a0 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
117b0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
117c0 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
117d0 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
117e0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
117f0 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
11800 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
11810 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
11820 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
11830 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
11840 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20  "winTruncate1", 
11870 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11880 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73   }else if( 0==os
11890 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69  SetEndOfFile(pFi
118a0 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20  le->h) &&.      
118b0 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e        ((lastErrn
118c0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
118d0 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45  or())!=ERROR_USE
118e0 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29  R_MAPPED_FILE) )
118f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11900 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
11910 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  no;.    rc = win
11920 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11930 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
11940 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11960 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
11970 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
11980 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ath);.  }..#if S
11990 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
119a0 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68  IZE>0.  /* If th
119b0 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63  e file was trunc
119c0 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
119d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
119e0 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d  currently.  ** m
119f0 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
11a00 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
11a10 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
11a20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
11a30 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65  will.  ** use re
11a40 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
11a50 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
11a60 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
11a70 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20  t from now on.. 
11a80 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11a90 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e  >pMapRegion && n
11aa0 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
11ab0 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  Size ){.    pFil
11ac0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42  e->mmapSize = nB
11ad0 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  yte;.  }.#endif.
11ae0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
11af0 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73  NCATE %d %lld %s
11b00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
11b10 42 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c  Byte, rc ? "fail
11b20 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
11b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11b40 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11b50 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
11b60 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
11b70 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
11b80 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
11b90 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
11ba0 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
11bb0 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
11bc0 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
11bd0 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
11be0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
11bf0 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
11c00 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
11c10 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
11c20 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
11c30 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
11c40 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
11c50 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
11c60 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
11c70 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
11c80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11c90 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
11ca0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
11cb0 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
11cc0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
11cd0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
11ce0 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
11cf0 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
11d00 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
11d10 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
11d20 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
11d30 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65  NC) || \.    (de
11d40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
11d50 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
11d60 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f  LITE_DEBUG)).  /
11d70 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e  *.  ** Used when
11d80 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
11d90 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61  is not defined a
11da0 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  nd by the assert
11db0 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f  () and/or.  ** O
11dc0 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e  STRACE() macros.
11dd0 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  .   */.  winFile
11de0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11df0 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20  le*)id;.#else.  
11e00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11e10 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  (id);.#endif..  
11e20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11e30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
11e40 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
11e50 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
11e60 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
11e70 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
11e80 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
11e90 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
11ea0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
11eb0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
11ec0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41  LL.  );..  OSTRA
11ed0 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE(("SYNC %d loc
11ee0 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
11ef0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
11f00 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  pe));..  /* Unix
11f10 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
11f20 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
11f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11f40 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
11f50 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
11f60 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
11f70 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
11f80 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
11f90 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
11fa0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
11fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
11fc0 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  L );..#ifndef SQ
11fd0 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53  LITE_TEST.  UNUS
11fe0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61  ED_PARAMETER(fla
11ff0 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gs);.#else.  if(
12000 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
12010 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
12020 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12030 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
12040 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
12050 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
12060 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
12070 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
12080 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
12090 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
120a0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
120b0 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
120c0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
120d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
120e0 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
120f0 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
12100 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
12110 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12120 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
12130 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
12140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
12160 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12170 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12180 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
12190 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
121a0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
121b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
121c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
121d0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
121e0 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
121f0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
12200 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
12210 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
12220 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
12230 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
12240 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12250 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
12260 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46   *pSize){.  winF
12270 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
12280 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
12290 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
122a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
122b0 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
122c0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
122d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
122e0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
122f0 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46  _WINRT.  {.    F
12300 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46  ILE_STANDARD_INF
12310 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  O info;.    if( 
12320 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
12330 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70  tionByHandleEx(p
12340 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61  File->h, FileSta
12350 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20  ndardInfo,.     
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  &info, sizeof(in
12390 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  fo)) ){.      *p
123a0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f  Size = info.EndO
123b0 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a  fFile.QuadPart;.
123c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
123d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
123e0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
123f0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
12400 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12410 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
12420 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12430 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12440 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
12450 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
12460 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
12470 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  }.#else.  {.    
12480 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
12490 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  .    DWORD lower
124a0 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
124b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20  lastErrno;..    
124c0 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65  lowerBits = osGe
124d0 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d  tFileSize(pFile-
124e0 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
124f0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28  .    *pSize = ((
12500 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75  (sqlite3_int64)u
12510 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b  pperBits)<<32) +
12520 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
12530 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73  if(   (lowerBits
12540 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
12550 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26  _SIZE).       &&
12560 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
12570 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
12580 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20  !=NO_ERROR) ){. 
12590 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
125a0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
125b0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  o;.      rc = wi
125c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
125d0 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
125e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
12600 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
12610 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
12620 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
12630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12640 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  * LOCKFILE_FAIL_
12650 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75  IMMEDIATELY is u
12660 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65  ndefined on some
12670 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
12680 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43  ..*/.#ifndef LOC
12690 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
126a0 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20  IATELY.# define 
126b0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
126c0 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64  MEDIATELY 1.#end
126d0 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  if..#ifndef LOCK
126e0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
126f0 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  OCK.# define LOC
12700 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
12710 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 2.#endif../
12720 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c  *.** Historicall
12730 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73  y, SQLite has us
12740 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b  ed both the Lock
12750 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  File and LockFil
12760 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  eEx functions..*
12770 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46  * When the LockF
12780 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ile function was
12790 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c   used, it was al
127a0 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
127b0 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61   fail.** immedia
127c0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
127d0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62   could not be ob
127e0 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69  tained.  Also, i
127f0 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  t always expecte
12800 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61  d to.** obtain a
12810 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12820 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61  .  These flags a
12830 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  re used with the
12840 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
12850 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c  tion.** and refl
12860 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74  ect those expect
12870 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72  ations; therefor
12880 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e  e, they should n
12890 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  ot be changed..*
128a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
128b0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a  _LOCKFILE_FLAGS.
128c0 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
128d0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20  LOCKFILE_FLAGS  
128e0 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
128f0 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a  IMMEDIATELY | \.
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55    LOCKFILE_EXCLU
12930 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69  SIVE_LOCK).#endi
12940 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74  f../*.** Current
12950 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72  ly, SQLite never
12960 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46   calls the LockF
12970 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77  ileEx function w
12980 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74  ithout wanting t
12990 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61  he.** call to fa
129a0 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  il immediately i
129b0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
129c0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
129d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
129e0 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
129f0 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
12a00 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
12a10 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  GS (LOCKFILE_FAI
12a20 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23  L_IMMEDIATELY).#
12a30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
12a40 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
12a50 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
12a60 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
12a70 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
12a80 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
12a90 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
12aa0 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
12ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
12ac0 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
12ad0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
12ae0 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
12af0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
12b00 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
12b10 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
12b20 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
12b30 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
12b40 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
12b50 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
12b60 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
12b70 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
12b80 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
12b90 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
12ba0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
12bb0 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
12bc0 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
12bd0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
12be0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
12bf0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
12c00 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
12c30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
12c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
12c50 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
12c60 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
12c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
12c80 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
12c90 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
12ca0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
12cb0 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
12cc0 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
12cd0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
12ce0 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
12cf0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
12d00 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
12d10 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
12d40 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
12d50 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
12d60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
12d70 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
12d80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12d90 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12da0 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
12db0 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
12dc0 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
12dd0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
12de0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
12df0 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
12e00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63  static int unloc
12e10 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
12e20 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
12e30 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
12e40 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69  stErrno;.  if( i
12e50 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
12e60 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
12e70 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
12e80 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
12e90 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
12ea0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12eb0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
12ec0 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
12ed0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
12ee0 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
12ef0 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
12f00 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
12f10 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
12f20 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
12f30 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12f40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12f50 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
12f60 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
12f70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12f80 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
12f90 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12fa0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
12fb0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
12fd0 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  unlockReadLock",
12fe0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12ff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
13000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13010 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13020 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
13030 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
13040 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
13050 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13060 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
13070 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
13080 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
13090 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
130a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
130b0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
130c0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
130d0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
130e0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
130f0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
13100 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
13110 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
13120 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
13130 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
13140 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
13150 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
13160 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
13170 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
13180 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
13190 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
131a0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
131b0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
131c0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
131d0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
131e0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
131f0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
13200 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
13210 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
13220 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
13230 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13240 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
13250 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
13260 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13270 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
13280 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13290 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
132a0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
132b0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
132c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
132d0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
132e0 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
132f0 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
13300 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
13310 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
13320 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
13330 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
13340 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
13350 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13360 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
13370 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
13380 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
13390 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
133a0 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
133b0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
133c0 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
133d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
133e0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
133f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13400 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
13410 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
13420 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
13430 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
13440 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13450 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
13460 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
13470 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
13480 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
13490 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
134a0 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
134b0 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
134c0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
134d0 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
134e0 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
134f0 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
13500 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
13510 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13520 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
13530 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
13540 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
13550 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
13560 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64  ACE(("LOCK %d %d
13570 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a   was %d(%d)\n",.
13580 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
13590 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
135a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
135b0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
135c0 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  kByte));..  /* I
135d0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
135e0 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
135f0 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
13600 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
13610 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
13620 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
13630 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
13640 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
13650 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
13660 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
13670 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
13680 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
13690 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
136a0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
136b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
136c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
136d0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
136e0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
136f0 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
13700 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
13710 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
13720 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
13730 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
13740 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
13750 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
13760 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
13770 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
13780 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
13790 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
137a0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
137b0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
137c0 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
137d0 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
137e0 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
137f0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
13800 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
13810 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
13820 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
13830 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
13840 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
13850 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
13860 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
13870 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
13880 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
13890 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
138a0 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
138b0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
138c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
138d0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
138e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
138f0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
13900 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
13910 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
13920 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
13930 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
13940 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
13950 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
13990 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
139a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
139b0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
139c0 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
139d0 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
139e0 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
139f0 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
13a00 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
13a10 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
13a20 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
13a30 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
13a40 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
13a50 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
13a60 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
13a70 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
13a80 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
13a90 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
13aa0 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
13ab0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
13ac0 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
13ad0 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
13ae0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
13af0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
13b00 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
13b10 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
13b20 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
13b30 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
13b40 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13b50 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
13b60 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
13b70 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
13b80 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
13b90 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13ba0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
13bb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
13bc0 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
13bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
13be0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
13bf0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
13c00 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
13c10 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
13c20 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
13c30 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
13c40 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
13c50 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
13c60 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
13c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13c80 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
13c90 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
13ca0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13cb0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
13cc0 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
13cd0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
13ce0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
13cf0 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
13d00 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
13d10 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13d20 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
13d30 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13d40 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
13d50 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
13d60 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
13d70 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
13d80 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
13d90 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
13da0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
13db0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
13dc0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13dd0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
13de0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
13df0 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
13e00 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
13e10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
13e20 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
13e30 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
13e40 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
13e50 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
13e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
13e70 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
13e80 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
13e90 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
13ea0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
13eb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13ec0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
13ed0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13ee0 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52     res = unlockR
13ef0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
13f00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
13f10 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
13f20 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73  , res));.    res
13f30 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
13f40 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
13f50 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
13f60 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
13f70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13f80 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
13f90 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
13fa0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
13fb0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
13fc0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
13fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
13fe0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13ff0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
14000 20 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72   OSTRACE(("error
14010 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c  -code = %d\n", l
14020 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20  astErrno));.    
14030 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46    getReadLock(pF
14040 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
14050 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
14060 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
14070 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
14080 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
14090 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
140a0 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
140b0 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
140c0 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
140d0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
140e0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
140f0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14100 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14110 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
14120 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
14130 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
14140 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
14150 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
14160 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
14170 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
14180 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
14190 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
141a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
141b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
141c0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41  STRACE(("LOCK FA
141d0 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
141e0 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
141f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
14200 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
14210 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
14220 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  );.    pFile->la
14230 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
14240 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
14250 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
14260 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14270 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
14280 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
14290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
142a0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
142b0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
142c0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
142d0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
142e0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
142f0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
14300 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
14310 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
14320 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
14330 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
14340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14350 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
14360 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14370 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
14380 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
14390 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
143a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
143b0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
143c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
143d0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
143e0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
143f0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
14400 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
14410 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
14420 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
14430 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
14440 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
14450 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
14460 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14470 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
14480 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
14490 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
144a0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
144b0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
144c0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
144d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
144e0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
144f0 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
14500 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
14510 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
14520 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
14530 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
14540 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
14550 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14560 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
14570 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
14580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14590 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
145a0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
145b0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
145c0 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
145d0 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
145e0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
145f0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
14600 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
14610 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
14620 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
14630 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
14640 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
14650 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14660 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
14670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14680 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
14690 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
146a0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
146b0 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
146c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
146d0 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
146e0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
146f0 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
14700 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
14710 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
14720 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
14730 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
14740 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
14750 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14760 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
14770 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
14780 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
14790 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
147a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
147b0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
147c0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
147d0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
147e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
147f0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
14800 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
14810 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
14820 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
14830 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
14840 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
14850 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a  aredLockByte));.
14860 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
14870 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
14880 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
14890 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
148a0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
148b0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
148c0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
148d0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
148e0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
148f0 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64  LOCK && !getRead
14900 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
14910 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
14920 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
14930 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
14940 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
14950 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
14960 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
14970 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
14980 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
14990 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
149a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
149b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
149c0 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
149d0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
149e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
149f0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
14a00 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
14a10 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
14a20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
14a30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
14a40 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
14a50 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
14a60 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14a70 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
14a80 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
14a90 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
14aa0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
14ab0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
14ac0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
14ad0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
14ae0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
14af0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
14b00 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
14b10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
14b20 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79  g is inititially
14b30 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
14b40 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
14b50 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
14b60 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
14b70 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
14b80 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
14b90 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
14ba0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
14bb0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
14bc0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
14bd0 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
14be0 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
14bf0 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
14c00 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
14c10 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
14c20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
14c30 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
14c40 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
14c50 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
14c60 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
14c70 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
14c80 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
14c90 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
14ca0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
14cb0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
14cc0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
14cd0 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
14ce0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
14cf0 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
14d00 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
14d10 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
14d20 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
14d30 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75  * Control and qu
14d40 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ery of the open 
14d50 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
14d60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
14d70 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
14d80 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14d90 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
14da0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
14db0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
14dc0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
14dd0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
14de0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
14df0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
14e00 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
14e10 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
14e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14e40 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
14e50 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
14e60 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
14e70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
14e80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
14ea0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
14eb0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
14ec0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
14ed0 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
14ee0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
14ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14f00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14f10 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
14f20 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
14f30 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
14f40 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
14f50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
14f60 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
14f70 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
14f80 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
14f90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14fb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
14fc0 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
14fd0 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
14fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14ff0 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
15000 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
15010 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
15020 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
15030 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
15040 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
15050 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
15060 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
15070 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
15080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
150a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
150b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
150c0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
150d0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
150e0 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69  _WAL: {.      wi
150f0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
15100 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
15110 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
15120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
15130 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
15140 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
15150 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
15160 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
15170 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
15180 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f  ile, WINFILE_PSO
15190 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
151a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
151b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
151c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
151d0 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
151e0 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
151f0 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
15200 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20  intf("win32");. 
15210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15220 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
15230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
15240 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
15250 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
15260 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
15270 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
15280 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33   ){.        win3
15290 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b  2IoerrRetry = a[
152a0 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
152b0 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20  .        a[0] = 
152c0 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b  win32IoerrRetry;
152d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
152e0 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
152f0 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
15300 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d  etryDelay = a[1]
15310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15320 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69         a[1] = wi
15330 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
15340 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
15350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15360 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
15370 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
15380 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
15390 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
153a0 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  le = sqlite3Mall
153b0 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65 2d 3e 70  ocZero( pFile->p
153c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
153d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
153e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ile ){.        g
153f0 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
15400 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
15410 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20  me, zTFile);.   
15420 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
15430 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
15440 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15460 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
15470 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
15480 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15490 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
154a0 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
154b0 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
154c0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  g;.      if( new
154d0 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
154e0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
15500 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
15510 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
15520 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
15530 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
15540 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
15550 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
15560 4c 69 6d 69 74 3e 3d 30 20 29 20 70 46 69 6c 65  Limit>=0 ) pFile
15570 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
15580 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
15590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
155a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
155b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
155c0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
155d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
155e0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
155f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
15600 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
15610 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
15620 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
15630 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
15640 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
15650 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
15660 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
15670 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
15680 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
15690 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
156a0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
156b0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
156c0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
156d0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
156e0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
156f0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
15700 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
15710 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
15720 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
15730 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
15740 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
15750 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
15760 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
15770 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
15780 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76  _file *id){.  (v
15790 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  oid)id;.  return
157a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
157b0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
157c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76  /*.** Return a v
157d0 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20  ector of device 
157e0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
157f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15800 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
15810 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
15820 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
15830 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69  File *p = (winFi
15840 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  le*)id;.  return
15850 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
15860 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
15870 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28  PEN |.         (
15880 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  (p->ctrlFlags & 
15890 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51  WINFILE_PSOW)?SQ
158a0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
158b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30  SAFE_OVERWRITE:0
158c0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
158d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
158e0 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  * .** Windows wi
158f0 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
15900 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
15910 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
15920 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
15930 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
15940 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
15950 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
15960 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
15970 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
15980 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
15990 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53  arity size..*/.S
159a0 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
159b0 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  sInfo;../*.** He
159c0 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
159d0 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
159e0 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
159f0 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
15a00 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
15a10 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
15a20 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
15a30 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
15a40 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20   .** this file, 
15a50 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
15a60 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
15a70 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
15a80 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
15a90 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
15aa0 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
15ab0 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
15ac0 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
15ad0 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
15ae0 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
15af0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
15b00 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
15b10 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
15b20 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
15b30 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
15b40 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
15b50 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
15b60 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
15b70 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
15b80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15b90 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
15ba0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
15bb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
15bc0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15bd0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15be0 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
15bf0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
15c00 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
15c10 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
15c20 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
15c30 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15c40 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15c50 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
15c60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15c70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
15c80 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
15c90 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
15ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
15cb0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15cc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15cd0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
15ce0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
15cf0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
15d00 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
15d10 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
15d20 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
15d30 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
15d40 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
15d50 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
15d60 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
15d70 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
15d80 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
15d90 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
15da0 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
15db0 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
15dc0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
15dd0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
15de0 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
15df0 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
15e00 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
15e10 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
15e20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
15e30 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
15e40 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
15e50 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
15e60 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
15e70 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
15e80 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
15e90 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
15ea0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
15eb0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
15ec0 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
15ed0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
15ee0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
15ef0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
15f00 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
15f10 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
15f20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
15f30 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
15f40 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
15f50 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
15f60 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
15f70 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
15f80 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
15f90 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
15fa0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
15fb0 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
15fc0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
15fd0 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
15fe0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
15ff0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
16000 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
16010 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
16020 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
16030 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16040 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
16050 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
16060 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
16070 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
16080 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
16090 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
160a0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160c0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
160d0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
160e0 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16100 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
16110 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
16120 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
16130 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
16160 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
16170 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
16180 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
16190 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
161a0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
161b0 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
161c0 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
161d0 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
161e0 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
16210 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
16220 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
16230 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
16240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16250 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
16260 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
16270 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
16280 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
16290 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
162a0 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
162b0 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
162c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
162d0 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
162e0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
162f0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
16300 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
16310 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
16320 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
16330 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
16340 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
16350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
16360 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
16370 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
16380 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
16390 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
163a0 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
163b0 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
163c0 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
163d0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
163e0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
163f0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
16400 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
16410 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
16420 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
16430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
16440 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
16450 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
16460 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
16470 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
16480 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
16490 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
164a0 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
164b0 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
164c0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
164d0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
164e0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
164f0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
16500 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
16510 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
16520 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
16530 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
16540 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
16550 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
16560 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
16570 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
16580 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
16590 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
165a0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
165b0 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
165c0 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
165d0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
165e0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
165f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16600 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
16610 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
16620 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
16630 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
16640 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
16650 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
16660 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16680 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
16690 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
166a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
166b0 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
166e0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
166f0 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
16700 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
16710 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
16720 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
16730 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
16740 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
16750 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
16760 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
16770 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
16780 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
16790 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
167a0 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
167b0 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
167c0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
167d0 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
167e0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
167f0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
16800 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
16810 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
16820 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
16830 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
16840 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
16850 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
16860 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
16870 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
16880 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
16890 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
168a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
168b0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
168c0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
168d0 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
168e0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
168f0 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
16900 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
16910 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
16920 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
16930 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
16940 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
16950 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
16960 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16970 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
16980 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
16990 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
169a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
169b0 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
169c0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
169d0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
169e0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
169f0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
16a00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
16a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16a20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
16a30 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
16a40 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
16a50 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41  ..  /* Release/A
16a60 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65  cquire the syste
16a70 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a  m-level lock */.
16a80 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
16a90 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  _SHM_UNLCK ){.  
16aa0 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b    rc = winUnlock
16ab0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
16ac0 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  le.h, ofst, 0, n
16ad0 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Byte, 0);.  }els
16ae0 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
16af0 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
16b00 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
16b10 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73     DWORD dwFlags
16b20 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
16b30 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
16b40 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
16b50 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
16b60 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
16b70 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
16b80 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  K;.    rc = winL
16b90 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16ba0 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
16bb0 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
16bc0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  , 0);.  }.  .  i
16bd0 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
16be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
16c00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16c10 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
16c20 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
16c30 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
16c40 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
16c50 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25  OCK %d %s %s 0x%
16c60 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20  08lx\n", .      
16c70 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
16c80 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e.h,.           
16c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16ca0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c  "ok" : "failed",
16cb0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
16cc0 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
16cd0 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   ? "UnlockFileEx
16ce0 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22  " : "LockFileEx"
16cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16d00 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b  le->lastErrno));
16d10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16d20 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
16d30 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
16d40 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
16d50 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
16d60 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
16d70 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
16d80 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
16d90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
16da0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
16db0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
16dc0 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
16dd0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
16de0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
16df0 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
16e00 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
16e10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
16e20 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
16e30 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
16e40 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
16e50 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
16e60 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
16e70 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
16e80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
16e90 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
16ea0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
16eb0 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
16ec0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
16ed0 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
16ee0 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20  p;.  BOOL bRc;. 
16ef0 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
16f00 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
16f10 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
16f20 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
16f30 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
16f40 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
16f50 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
16f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
16f70 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d  utex ) sqlite3_m
16f80 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
16f90 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ex);.      for(i
16fa0 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
16fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16fc0 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
16fd0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
16fe0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
16ff0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
17000 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
17010 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  unmap region=%d 
17020 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
17030 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
17040 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
17050 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
17060 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
17070 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
17080 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
17090 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
170a0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
170b0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
170c0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
170d0 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67  pid-%d close reg
170e0 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17100 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
17110 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
17140 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
17150 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
17160 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
17170 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
17180 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
17190 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
171a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
171b0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
171c0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
171d0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
171e0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
171f0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17200 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
17210 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
17220 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
17230 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
17240 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
17250 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
17260 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
17270 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
17280 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
17290 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
172a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
172b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
172c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
172d0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
172e0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
172f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
17300 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
17310 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
17320 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
17330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17340 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
17350 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17360 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
17370 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
17380 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
17390 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
173a0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
173b0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
173c0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
173d0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
173e0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
173f0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
17400 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
17410 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
17420 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
17430 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
17440 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
17450 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
17460 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
17470 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
17480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17490 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
174a0 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
174b0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
174c0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
174d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
174e0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
174f0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
17500 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
17510 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
17520 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
17530 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
17540 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
17570 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
17580 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
17590 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
175a0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
175b0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
175c0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
175f0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
17600 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
17610 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
17620 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
17630 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
17640 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
17650 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
17660 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
17670 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
17680 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
17690 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
176a0 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
176b0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
176c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
176d0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
176e0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
176f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
17700 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
17710 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
17720 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
17730 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
17740 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
17750 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
17760 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
17770 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
17780 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
17790 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
177a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
177b0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
177c0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
177d0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
177e0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
177f0 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
17800 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
17810 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
17820 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
17830 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
17840 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
17850 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
17860 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
17870 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
17880 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
17890 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
178a0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
178b0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
178c0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
178d0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
178e0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
178f0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
17900 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
17910 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
17920 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
17930 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
17940 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
17950 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
17960 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
17970 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
17980 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
17990 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
179a0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
179b0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
179c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
179d0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
179e0 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
179f0 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
17a00 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
17a10 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
17a20 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
17a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17a40 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
17a50 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
17a60 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
17a70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
17a80 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
17a90 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
17aa0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
17ab0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
17ac0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
17ad0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
17ae0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
17af0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
17b00 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
17b10 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
17b20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
17b30 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
17b40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17b50 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
17b60 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
17b70 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
17b80 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
17b90 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
17bb0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
17be0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
17c00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
17c10 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
17c20 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
17c30 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
17c40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17c50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
17c60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
17c70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
17c80 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
17c90 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
17ca0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
17cb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
17cc0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
17cd0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
17ce0 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
17cf0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
17d00 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
17d10 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
17d20 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
17d30 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
17d40 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
17d50 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
17d60 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
17d70 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
17d80 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
17d90 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
17da0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
17db0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
17dc0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
17dd0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
17de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17e00 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
17e10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
17e20 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
17e30 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
17e40 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
17e50 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
17e60 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
17e70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17e90 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
17ea0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
17eb0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
17ec0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
17ed0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
17ee0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
17ef0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
17f00 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
17f10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
17f20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
17f30 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
17f40 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
17f50 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
17f60 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
17f70 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
17f80 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
17f90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17fa0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
17fb0 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
17fc0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
17fd0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
17fe0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
17ff0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
18000 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
18010 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18020 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
18030 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
18040 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
18050 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
18060 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
18070 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
18080 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
18090 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
180a0 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
180b0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
180c0 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
180d0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
180e0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
180f0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
18100 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
18110 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
18120 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
18130 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
18140 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
18150 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
18160 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
18170 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
18180 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
18190 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
181a0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
181b0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
181c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
181d0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
181e0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
181f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
18200 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
18210 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18220 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
18230 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
18240 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
18250 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
18260 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
18270 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
18280 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
18290 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
182a0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
182b0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
182c0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
182d0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
182e0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
182f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
18300 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
18310 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
18320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18330 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
18340 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
18350 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
18360 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
18370 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
18380 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
18390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
183a0 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
183b0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
183c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
183d0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
183e0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
183f0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
18400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
18410 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
18420 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
18430 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
18440 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
18450 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
18460 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
18470 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
18480 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
18490 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
184a0 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
184b0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
184c0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
184d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
184e0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
184f0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
18500 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
18510 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
18520 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
18530 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
18540 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
18550 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
18560 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18570 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
18580 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
18590 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
185a0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
185b0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
185c0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
185d0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
185e0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
185f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
18600 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
18610 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
18620 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
18630 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
18640 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
18650 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
18660 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
18670 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
18680 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18690 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
186a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
186b0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
186c0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
186d0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
186e0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
186f0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
18700 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
18710 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
18720 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
18730 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
18740 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
18750 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
18760 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
18770 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
18780 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18790 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
187a0 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
187b0 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
187c0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
187d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
187e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
187f0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
18800 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
18810 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
18820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18830 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
18840 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
18850 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18860 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
18870 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
18880 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
18890 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
188a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
188b0 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
188c0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
188d0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
188e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
188f0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
18900 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
18910 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
18940 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
18950 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
18960 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
18970 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
18980 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
18990 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
189a0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
189b0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
189c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
189d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
189e0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
189f0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18a20 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
18a30 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
18a40 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
18a50 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
18a60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18a70 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
18a80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
18a90 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
18aa0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
18ad0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
18ae0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
18af0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
18b00 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
18b10 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
18b20 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
18b30 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
18b40 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
18b50 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
18b60 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
18b70 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
18b80 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
18b90 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
18ba0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
18bb0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
18bc0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
18bd0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
18be0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
18bf0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
18c00 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
18c10 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
18c20 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
18c30 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
18c40 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
18c50 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
18c60 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
18c70 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
18c80 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
18c90 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
18ca0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18cb0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
18cc0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
18cd0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
18ce0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
18cf0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
18d00 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
18d10 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
18d20 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
18d30 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
18d40 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
18d50 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
18d60 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
18d70 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
18d80 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
18d90 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
18da0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
18db0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
18dc0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
18dd0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
18de0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
18df0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
18e00 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
18e10 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
18e20 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
18e30 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
18e40 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
18e50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
18e60 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18e70 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
18e80 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
18e90 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
18ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18eb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18ec0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
18ed0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
18ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
18ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f00 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
18f10 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
18f20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
18f30 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
18f40 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
18f50 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
18f60 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
18f70 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
18f80 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
18f90 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
18fa0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
18fb0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
18fc0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
18fd0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
18fe0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
18ff0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
19000 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
19010 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
19020 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
19030 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
19040 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
19050 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
19060 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
19070 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
19080 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
19090 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
190a0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
190b0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
190c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
190d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
190e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
190f0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
19100 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
19110 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
19120 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
19130 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
19140 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
19150 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
19160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19170 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
19180 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
19190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
191a0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
191b0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
191c0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
191d0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
191e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
191f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19200 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
19210 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
19220 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
19230 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
19240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19250 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
19260 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
19270 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19280 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
19290 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
192a0 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
192b0 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
192c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
192d0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
192e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
192f0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
19300 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
19310 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
19320 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
19330 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
19340 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
19350 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
19360 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
19370 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19380 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
19390 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
193a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
193b0 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
193c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
193d0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
193e0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
193f0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
19400 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
19410 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
19420 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
19430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19450 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
19460 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
19470 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
19480 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
19490 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
194a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
194b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
194c0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
194d0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
194e0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
194f0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
19500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19510 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19520 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
19530 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
19540 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
19550 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
19560 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c  ot %03x,%03x %s\
19570 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
19580 2d 3e 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74  ->id, (int)osGet
19590 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
195a0 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
195b0 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
195c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f 20             rc ? 
195d0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
195e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
195f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
19600 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
19610 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
19620 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
19630 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
19640 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
19650 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
19660 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
19670 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
19680 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
19690 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
196a0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
196b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
196c0 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
196d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
196e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
196f0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
19700 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
19710 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
19720 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f  RAMETER(fd);.  /
19730 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
19740 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
19750 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
19760 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
19770 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
19780 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
19790 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
197a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
197b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
197c0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
197d0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
197e0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
197f0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
19800 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
19810 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
19820 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
19830 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
19840 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
19850 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
19860 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
19870 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
19880 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
19890 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
198a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
198b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
198c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
198d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
198e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
198f0 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
19900 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
19910 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
19920 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
19930 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
19940 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
19950 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
19960 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
19970 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
19980 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
19990 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
199a0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
199b0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
199c0 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
199d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
199e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
199f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
19a00 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
19a10 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
19a20 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
19a30 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
19a40 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
19a50 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
19a60 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
19a70 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
19a80 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
19a90 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
19aa0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
19ab0 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
19ac0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
19ad0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
19ae0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
19af0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
19b00 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
19b10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
19b20 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
19b30 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
19b40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19b50 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
19b60 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
19b70 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
19b80 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
19b90 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
19ba0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
19bb0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
19bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19bd0 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
19be0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
19bf0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
19c00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19c10 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
19c20 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c40 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
19c50 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
19c60 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
19c70 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
19c80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
19c90 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
19ca0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
19cb0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
19cc0 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
19cd0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
19ce0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
19cf0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
19d00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19d10 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63  if( !p ){.    rc
19d20 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
19d30 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
19d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19d50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19d60 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d  ;.    p = pDbFd-
19d70 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
19d80 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
19d90 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ode;..  sqlite3_
19da0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
19db0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
19dc0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
19dd0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
19de0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
19df0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
19e00 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
19e10 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
19e20 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
19e30 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
19e40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19e50 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
19e60 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
19e70 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
19e80 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
19e90 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
19ea0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
19eb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19ec0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
19ed0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
19ee0 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
19ef0 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
19f00 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
19f10 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
19f20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
19f30 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
19f40 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
19f50 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
19f60 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
19f70 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19f80 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
19f90 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
19fa0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
19fb0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
19fc0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
19fd0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
19fe0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
19ff0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
1a000 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
1a010 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
1a020 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
1a030 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a050 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1a060 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1a070 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1a080 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1a090 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1a0a0 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
1a0b0 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
1a0c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1a0d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
1a0e0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
1a0f0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1a100 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
1a110 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
1a120 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
1a130 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
1a140 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
1a150 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
1a160 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1a170 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
1a180 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a190 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
1a1a0 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
1a1b0 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
1a1c0 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1a1d0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1a1e0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1a1f0 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1a200 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
1a210 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
1a220 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
1a230 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1a240 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1a250 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1a260 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1a270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1a290 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a2a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1a2b0 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1a2c0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1a2d0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1a2e0 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
1a2f0 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
1a300 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1a310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a320 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
1a330 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1a340 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
1a350 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
1a360 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
1a370 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
1a380 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
1a390 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
1a3a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1a3b0 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1a3c0 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1a3d0 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1a3e0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1a3f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1a400 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1a410 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1a420 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
1a430 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d  mNode->aRegion =
1a440 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69   apNew;..    whi
1a450 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
1a460 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1a470 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  {.      HANDLE h
1a480 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  Map = NULL;     
1a490 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70      /* file-mapp
1a4a0 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ing handle */.  
1a4b0 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d      void *pMap =
1a4c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a4d0 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  /* Mapped memory
1a4e0 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   region */.     
1a4f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1a500 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1a510 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1a520 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1a530 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1a540 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1a550 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1a560 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1a570 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1a580 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1a590 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1a5a0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1a5b0 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1a5c0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
1a5d0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1a5e0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1a5f0 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1a600 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1a610 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1a620 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1a630 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1a640 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1a650 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1a660 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
1a670 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1a680 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1a690 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
1a6a0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
1a6b0 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
1a6c0 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25   create region=%
1a6d0 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22  d nbyte=%d %s\n"
1a6e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a6f0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
1a700 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1a710 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1a720 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1a730 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
1a740 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1a750 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
1a760 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1a770 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
1a780 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
1a790 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
1a7a0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1a7b0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1a7c0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1a7d0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23  onGranularity;.#
1a7e0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a7f0 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  RT.        pMap 
1a800 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1a810 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46  eFromApp(hMap, F
1a820 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1a830 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1a840 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
1a850 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1a860 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1a870 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1a880 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1a890 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1a8a0 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
1a8b0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1a8c0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1a8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
1a8e0 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1a8f0 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1a900 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1a910 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
1a920 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
1a930 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d  E(("SHM-MAP pid-
1a940 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64  %d map region=%d
1a950 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d   offset=%d size=
1a960 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
1a970 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1a980 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1a990 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1a9a0 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
1a9b0 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
1a9c0 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
1a9d0 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
1a9e0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1a9f0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
1aa00 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
1aa10 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1aa20 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1aa30 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
1aa40 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1aa50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
1aa60 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
1aa70 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1aa80 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1aa90 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1aaa0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1aab0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1aac0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1aad0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1aae0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1aaf0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1ab00 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1ab10 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1ab20 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1ab30 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1ab40 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1ab50 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1ab60 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1ab70 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1ab80 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1ab90 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1aba0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1abb0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1abc0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1abd0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1abe0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1abf0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1ac00 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1ac10 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1ac20 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1ac30 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1ac40 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1ac50 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1ac60 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1ac70 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1ac80 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1ac90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1aca0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1acb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1acc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1acd0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1ace0 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1acf0 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1ad00 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1ad10 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1ad20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1ad30 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1ad40 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1ad50 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1ad60 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
1ad70 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
1ad80 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1ad90 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
1ada0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1adb0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
1adc0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
1add0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
1ade0 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
1adf0 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  File!=0 );.  if(
1ae00 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1ae10 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  on ){.    if( !o
1ae20 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1ae30 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1ae40 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  on) ){.      pFi
1ae50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1ae60 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1ae70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
1ae80 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1ae90 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1aea0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d           "winUnm
1aed0 61 70 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ap1", pFile->zPa
1aee0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1aef0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1af00 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
1af10 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
1af20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1af30 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
1af40 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
1af50 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
1af60 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
1af70 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
1af80 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1af90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1afa0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1afb0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
1afc0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1afd0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65  OERR_MMAP, pFile
1afe0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 32        "winUnmap2
1b010 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1b020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1b030 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1b040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b050 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b060 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
1b070 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
1b080 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
1b090 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
1b0a0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
1b0b0 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
1b0c0 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
1b0d0 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
1b0e0 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
1b0f0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
1b100 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
1b110 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
1b120 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
1b130 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
1b140 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1b150 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
1b160 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
1b170 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1b180 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1b190 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
1b1a0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
1b1b0 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
1b1c0 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
1b1d0 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
1b1e0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
1b1f0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
1b200 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1b210 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
1b220 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1b230 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1b240 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1b250 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1b260 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1b270 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1b280 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1b290 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1b2a0 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
1b2b0 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
1b2c0 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65  MAP_SIZE, whiche
1b2d0 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
1b2e0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1b2f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
1b300 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
1b310 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
1b320 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
1b330 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
1b340 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
1b350 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
1b360 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1b370 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
1b380 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1b390 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
1b3a0 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69  nFile *pFd, sqli
1b3b0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
1b3c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
1b3d0 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
1b3e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1b3f0 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
1b400 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
1b410 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
1b420 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
1b430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b440 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
1b450 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1b460 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1b470 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29  ile*)pFd, &nMap)
1b480 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1b490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b4a0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1b4b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b4c0 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
1b4d0 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
1b4e0 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
1b4f0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61  zeMax;.  }.  nMa
1b500 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69  p &= ~(sqlite3_i
1b510 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f  nt64)(winSysInfo
1b520 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29  .dwPageSize - 1)
1b530 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  ;. .  if( nMap==
1b540 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
1b550 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
1b560 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1b570 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
1b580 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
1b590 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1b5a0 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
1b5b0 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1b5c0 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
1b5d0 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
1b5e0 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
1b5f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1b600 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
1b610 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1b620 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  E_RDONLY)==0 ){.
1b630 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
1b640 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
1b650 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46        flags |= F
1b660 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20  ILE_MAP_WRITE;. 
1b670 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1b680 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
1b690 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1b6a0 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1b6b0 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
1b6c0 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
1b6d0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1b6e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1b6f0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1b700 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1b710 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b720 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
1b730 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1b760 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1b770 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1b7a0 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1b7b0 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1b7c0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1b7d0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1b7e0 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  I).    pFd->hMap
1b7f0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1b800 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20  appingA(pFd->h, 
1b810 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b840 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1b850 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1b860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1b890 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1b8a0 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  L);.#endif.    i
1b8b0 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55  f( pFd->hMap==NU
1b8c0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d  LL ){.      pFd-
1b8d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1b8e0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1b8f0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1b900 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1b910 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
1b920 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46  "winMapfile", pF
1b950 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1b960 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
1b970 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
1b980 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
1b990 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
1b9a0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1b9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b9c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1b9d0 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49   (nMap % winSysI
1b9e0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d  nfo.dwPageSize)=
1b9f0 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  =0 );.#if SQLITE
1ba00 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
1ba10 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1ba20 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
1ba30 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1ba40 20 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20   nMap);.#else.  
1ba50 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1ba60 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
1ba70 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
1ba80 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
1ba90 66 66 66 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  fff );.    pNew 
1baa0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1bab0 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
1bac0 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
1bad0 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
1bae0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
1baf0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
1bb00 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
1bb10 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
1bb20 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1bb30 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1bb40 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1bb50 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
1bb60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1bb70 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
1bb80 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1bba0 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46 64 2d  inMapfile", pFd-
1bbb0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72  >zPath);.      r
1bbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bbd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
1bbe0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
1bbf0 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
1bc00 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
1bc10 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
1bc20 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
1bc30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1bc40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
1bc50 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
1bc60 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
1bc70 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
1bc80 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1bc90 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
1bca0 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
1bcb0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
1bcc0 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
1bcd0 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
1bce0 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
1bcf0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
1bd00 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
1bd10 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
1bd20 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
1bd30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1bd40 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
1bd50 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
1bd60 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1bd70 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
1bd80 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1bd90 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
1bda0 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
1bdb0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
1bdc0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1bdd0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
1bde0 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
1bdf0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
1be00 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1be10 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
1be20 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
1be30 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
1be40 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
1be50 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  ly .** release t
1be60 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
1be70 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65  calling unixUnfe
1be80 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tch()..*/.static
1be90 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71   int winFetch(sq
1bea0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1beb0 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
1bec0 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
1bed0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1bee0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
1bef0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
1bf00 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
1bf10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
1bf20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
1bf30 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
1bf40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1bf50 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1bf60 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
1bf70 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
1bf80 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
1bf90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1bfa0 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
1bfb0 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
1bfc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bfd0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1bfe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1bff0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69  d->mmapSize >= i
1c000 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20  Off+nAmt ){.    
1c010 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29    *pp = &((u8 *)
1c020 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
1c030 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46  [iOff];.      pF
1c040 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a  d->nFetchOut++;.
1c050 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c060 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c070 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
1c080 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
1c090 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
1c0a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1c0b0 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a  ion releases a .
1c0c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
1c0d0 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
1c0e0 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  ier call to unix
1c0f0 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63  Fetch(). The sec
1c100 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
1c110 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1c120 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
1c130 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1c140 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1c150 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77   argument that w
1c160 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  as passed to the
1c170 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76   unixFetch() inv
1c180 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  ocation. .**.** 
1c190 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
1c1a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
1c1b0 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
1c1c0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1c1d0 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66  alled .** to inf
1c1e0 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
1c1f0 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
1c200 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
1c210 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
1c220 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20   .** may now be 
1c230 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1c240 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a  ld be unmapped..
1c250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c260 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  nUnfetch(sqlite3
1c270 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
1c280 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
1c290 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1c2a0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
1c2b0 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
1c2c0 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
1c2d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1c2e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1c2f0 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
1c300 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
1c310 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
1c320 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
1c330 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
1c340 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
1c350 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
1c360 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
1c370 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
1c380 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1c390 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
1c3a0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
1c3b0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c3c0 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
1c3d0 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
1c3e0 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
1c3f0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
1c400 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
1c410 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
1c420 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
1c430 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
1c440 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
1c450 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
1c460 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
1c470 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20  .    /* FIXME:  
1c480 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79  If Windows truly
1c490 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73   always prevents
1c4a0 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64   truncating or d
1c4b0 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a  eleting a.    **
1c4c0 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61   file while a ma
1c4d0 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74  pping is held, t
1c4e0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1c4f0 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29  g winUnmapfile()
1c500 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20   call.    ** is 
1c510 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20  unnecessary can 
1c520 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d  can be omitted -
1c530 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70   potentially imp
1c540 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65  roving.    ** pe
1c550 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20  rformance.  */. 
1c560 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1c570 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
1c580 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
1c590 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out>=0 );.#endif
1c5a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c5b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
1c5c0 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
1c5d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
1c5e0 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
1c5f0 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
1c600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c610 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
1c620 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
1c630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1c650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1c6a0 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
1c6b0 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
1c6c0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
1c6d0 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
1c6e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
1c6f0 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
1c700 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1c710 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f  io_methods winIo
1c720 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20  Method = {.  3, 
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c750 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
1c760 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  nClose,         
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c780 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e   xClose */.  win
1c790 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7b0 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72  xRead */.  winWr
1c7c0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1c7e0 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75  rite */.  winTru
1c7f0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1c800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1c810 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53  uncate */.  winS
1c820 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1c830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c840 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Sync */.  winFil
1c850 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
1c860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1c870 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c  leSize */.  winL
1c880 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c8a0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c  Lock */.  winUnl
1c8b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1c8d0 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65  lock */.  winChe
1c8e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
1c8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
1c900 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1c910 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  */.  winFileCont
1c920 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
1c930 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1c940 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63  trol */.  winSec
1c950 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
1c960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1c970 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69  ctorSize */.  wi
1c980 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
1c990 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a  istics,       /*
1c9a0 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
1c9b0 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e  ristics */.  win
1c9c0 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9e0 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e  xShmMap */.  win
1c9f0 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca10 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
1ca20 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca40 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
1ca50 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20    winShmUnmap,  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
1ca80 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20  /.  winFetch,   
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
1cab0 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20  .  winUnfetch   
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
1cae0 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
1caf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb30 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1cb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1cb60 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1cb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb80 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1cb90 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1cba0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1cbb0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1cbc0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1cbd0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
1cbe0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
1cbf0 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
1cc00 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
1cc10 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1cc20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
1cc30 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
1cc40 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
1cc50 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
1cc60 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
1cc70 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
1cc80 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
1cc90 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
1cca0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1ccb0 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65  atic void *conve
1ccc0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  rtUtf8Filename(c
1ccd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1cce0 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a  name){.  void *z
1ccf0 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
1cd00 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1cd10 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
1cd20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  utf8ToUnicode(zF
1cd30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
1cd40 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1cd50 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1cd60 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
1cd70 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
1cd80 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a  2_utf8_to_mbcs(z
1cd90 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
1cda0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
1cdb0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
1cdc0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
1cdd0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
1cde0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ed;.}../*.** Cre
1cdf0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
1ce00 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
1ce10 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
1ce20 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a   big enough to.*
1ce30 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e  * hold at pVfs->
1ce40 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61  mxPathname chara
1ce50 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
1ce60 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
1ce70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1ce80 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1ce90 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
1cea0 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
1ceb0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
1cec0 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
1ced0 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
1cee0 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
1cef0 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
1cf00 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70 50   j;.  int nTempP
1cf10 61 74 68 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  ath;.  char zTem
1cf20 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 32  pPath[MAX_PATH+2
1cf30 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ];..  /* It's od
1cf40 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
1cf50 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
1cf60 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
1cf70 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
1cf80 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
1cf90 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
1cfa0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
1cfb0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
1cfc0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
1cfd0 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
1cfe0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1cff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d000 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  ERR );..  memset
1d010 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 4d  (zTempPath, 0, M
1d020 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69  AX_PATH+2);..  i
1d030 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
1d040 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
1d050 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1d060 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
1d070 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
1d080 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1d090 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66  ectory);.  }.#if
1d0a0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1d0b0 54 0a 20 20 65 6c 73 65 20 69 66 28 20 69 73 4e  T.  else if( isN
1d0c0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
1d0d0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48  *zMulti;.    WCH
1d0e0 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58  AR zWidePath[MAX
1d0f0 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65  _PATH];.    osGe
1d100 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
1d110 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
1d120 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
1d130 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
1d140 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
1d150 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
1d160 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d170 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
1d180 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
1d190 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
1d1a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
1d1b0 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ulti);.    }else
1d1c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d1d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1d1e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  M;.    }.  }.#if
1d1f0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1d200 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1d210 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
1d220 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63  8;.    char zMbc
1d230 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  sPath[MAX_PATH];
1d240 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61  .    osGetTempPa
1d250 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  thA(MAX_PATH-30,
1d260 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20   zMbcsPath);.   
1d270 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
1d280 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1d290 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
1d2a0 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
1d2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1d2c0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1d2d0 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
1d2e0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
1d2f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d300 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
1d310 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
1d320 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d330 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
1d340 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
1d350 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1d360 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
1d370 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
1d380 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
1d390 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
1d3a0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
1d3b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1d3c0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65  RROR..  */.  nTe
1d3d0 6d 70 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  mpPath = sqlite3
1d3e0 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61  Strlen30(zTempPa
1d3f0 74 68 29 3b 0a 0a 20 20 69 66 28 20 28 6e 54 65  th);..  if( (nTe
1d400 6d 70 50 61 74 68 20 2b 20 73 71 6c 69 74 65 33  mpPath + sqlite3
1d410 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
1d420 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1d430 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20  ) + 18) >= nBuf 
1d440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1d450 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d460 0a 20 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61  .  for(i=nTempPa
1d470 74 68 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70  th; i>0 && zTemp
1d480 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b  Path[i-1]=='\\';
1d490 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50   i--){}.  zTempP
1d4a0 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73  ath[i] = 0;..  s
1d4b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d4c0 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28  nBuf-18, zBuf, (
1d4d0 6e 54 65 6d 70 50 61 74 68 20 3e 20 30 29 20 3f  nTempPath > 0) ?
1d4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d4f0 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51          "%s\\"SQ
1d500 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1d510 52 45 46 49 58 20 3a 20 53 51 4c 49 54 45 5f 54  REFIX : SQLITE_T
1d520 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
1d530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d540 20 20 20 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a      zTempPath);.
1d550 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
1d560 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
1d570 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1d580 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
1d590 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
1d5a0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1d5b0 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
1d5c0 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
1d5d0 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
1d5e0 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
1d5f0 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
1d600 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
1d610 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f  f[j+1] = 0;..  O
1d620 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49  STRACE(("TEMP FI
1d630 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a  LENAME: %s\n", z
1d640 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
1d650 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
1d660 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1d670 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
1d680 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64  le is really a d
1d690 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
1d6a0 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74  n false if.** it
1d6b0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   is something ot
1d6c0 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63  her than a direc
1d6d0 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72  tory, or if ther
1d6e0 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
1d6f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
1d700 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  ation failure..*
1d710 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1d720 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
1d730 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20   *zConverted){. 
1d740 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
1d750 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
1d760 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
1d770 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1d780 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1d790 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
1d7a0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
1d7b0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
1d7c0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
1d7d0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
1d7e0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
1d7f0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
1d800 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
1d810 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1d820 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
1d850 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1d880 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
1d890 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1d8a0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
1d8b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1d8c0 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
1d8d0 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
1d8e0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
1d8f0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
1d900 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
1d910 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
1d920 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
1d930 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1d940 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
1d950 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
1d960 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
1d970 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
1d980 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
1d990 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
1d9a0 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
1d9b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1d9c0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
1d9d0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
1d9e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1d9f0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Vfs,        /* N
1da00 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
1da10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1da20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1da30 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
1da40 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
1da50 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
1da60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
1da70 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
1da80 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
1da90 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1daa0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
1dab0 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
1dac0 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
1dad0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1dae0 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
1daf0 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
1db00 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1db10 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65  no;.  DWORD dwDe
1db20 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
1db30 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
1db40 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
1db50 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
1db60 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
1db70 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1db80 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
1db90 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
1dba0 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
1dbb0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
1dbc0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
1dbd0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1dbe0 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
1dbf0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
1dc00 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
1dc10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
1dc20 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
1dc30 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
1dc40 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
1dc50 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
1dc60 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
1dc70 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
1dc80 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
1dc90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
1dca0 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
1dcb0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
1dcc0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
1dcd0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
1dce0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
1dcf0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
1dd00 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d  name[MAX_PATH+2]
1dd10 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ;     /* Buffer 
1dd20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74  used to create t
1dd30 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  emp filename */.
1dd40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dd50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1dd60 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
1dd70 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
1dd80 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1dd90 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
1dda0 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
1ddb0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
1ddc0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
1ddd0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
1dde0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
1ddf0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
1de00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1de10 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
1de20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
1de30 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1de40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1de50 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
1de60 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
1de70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1de80 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
1de90 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
1dea0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1deb0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
1dec0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
1ded0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
1dee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1def0 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
1df00 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
1df10 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
1df20 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
1df30 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
1df40 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1df50 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
1df60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1df70 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
1df80 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1df90 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
1dfa0 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   ));.#endif..  /
1dfb0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
1dfc0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
1dfd0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
1dfe0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
1dff0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
1e000 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
1e010 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
1e020 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
1e030 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
1e040 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
1e050 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
1e060 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
1e070 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
1e080 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
1e090 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1e0a0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1e0b0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
1e0c0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
1e0d0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1e0e0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1e0f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
1e100 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
1e110 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
1e120 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
1e130 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
1e140 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
1e150 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
1e160 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
1e170 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
1e180 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
1e190 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
1e1a0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1e1b0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
1e1c0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
1e1d0 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
1e1e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
1e1f0 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
1e200 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
1e210 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
1e220 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
1e230 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
1e240 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1e250 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1e260 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1e270 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
1e280 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1e290 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1e2a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1e2b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
1e2c0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1e2d0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1e2e0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1e2f0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1e300 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
1e310 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1e320 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1e330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1e340 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1e350 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
1e360 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
1e370 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
1e380 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
1e390 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
1e3a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1e3b0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
1e3c0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1e3d0 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
1e3e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1e3f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1e400 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1e410 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1e420 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1e430 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1e440 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
1e450 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1e460 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1e470 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1e480 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1e490 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
1e4a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1e4b0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
1e4c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
1e4d0 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
1e4e0 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
1e4f0 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
1e500 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
1e510 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
1e520 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1e530 54 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  T.  if( !sqlite3
1e540 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
1e550 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1e560 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
1e570 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
1e580 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1e590 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
1e5a0 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
1e5b0 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
1e5c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
1e5d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1e5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e5f0 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
1e600 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
1e610 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
1e620 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se .  */.  if( !
1e630 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
1e640 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
1e650 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
1e660 61 6c 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  al);.    memset(
1e670 7a 54 6d 70 6e 61 6d 65 2c 20 30 2c 20 4d 41 58  zTmpname, 0, MAX
1e680 5f 50 41 54 48 2b 32 29 3b 0a 20 20 20 20 72 63  _PATH+2);.    rc
1e690 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d   = getTempname(M
1e6a0 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e  AX_PATH+2, zTmpn
1e6b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e6c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e6d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e6e0 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
1e6f0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
1e700 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
1e710 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
1e720 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
1e730 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
1e740 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
1e750 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
1e760 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
1e770 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
1e780 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
1e790 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1e7a0 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
1e7b0 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
1e7c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1e7d0 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
1e7e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
1e7f0 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66   ||.        zUtf
1e800 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74  8Name[strlen(zUt
1e810 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
1e820 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
1e830 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
1e840 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
1e850 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
1e860 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1e870 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
1e880 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
1e890 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1e8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e8b0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1e8c0 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
1e8d0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
1e8e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e8f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1e900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e910 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20  ANTOPEN_ISDIR;. 
1e920 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
1e930 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
1e940 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
1e950 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
1e960 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
1e970 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
1e980 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
1e990 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
1e9a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
1e9b0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
1e9c0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
1e9d0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
1e9e0 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
1e9f0 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
1ea00 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
1ea10 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
1ea20 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
1ea30 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
1ea40 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
1ea50 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
1ea60 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
1ea70 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
1ea80 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
1ea90 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
1eaa0 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
1eab0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
1eac0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
1ead0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1eae0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
1eaf0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
1eb00 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
1eb10 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
1eb20 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
1eb30 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
1eb40 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
1eb50 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
1eb60 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
1eb70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1eb80 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
1eb90 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
1eba0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
1ebb0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
1ebc0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
1ebd0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
1ebe0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
1ebf0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
1ec00 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
1ec10 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
1ec20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1ec30 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
1ec40 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
1ec50 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
1ec60 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
1ec70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
1ec80 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1ec90 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
1eca0 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
1ecd0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
1ece0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
1ed10 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
1ed20 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1ed30 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1ed40 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
1ed50 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
1ed60 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
1ed70 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
1ed80 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
1ed90 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
1eda0 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
1edb0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
1edc0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
1edd0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
1ede0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
1edf0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
1ee00 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1ee10 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
1ee20 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
1ee30 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  if..  if( isNT()
1ee40 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
1ee50 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41  S_WINRT.    CREA
1ee60 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
1ee70 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65  _PARAMETERS exte
1ee80 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a  ndedParameters;.
1ee90 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1eea0 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20  meters.dwSize = 
1eeb0 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c  sizeof(CREATEFIL
1eec0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
1eed0 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74  METERS);.    ext
1eee0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1eef0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
1ef00 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   =.            d
1ef10 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1ef20 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49  tes & FILE_ATTRI
1ef30 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  BUTE_MASK;.    e
1ef40 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1ef50 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20  s.dwFileFlags = 
1ef60 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1ef70 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47  utes & FILE_FLAG
1ef80 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
1ef90 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
1efa0 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73  SecurityQosFlags
1efb0 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e   = SECURITY_ANON
1efc0 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e  YMOUS;.    exten
1efd0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70  dedParameters.lp
1efe0 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74  SecurityAttribut
1eff0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  es = NULL;.    e
1f000 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1f010 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20  s.hTemplateFile 
1f020 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c  = NULL;.    whil
1f030 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
1f040 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a  File2((LPCWSTR)z
1f050 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
1f080 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
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 64 77 53 68 61 72 65 4d          dwShareM
1f0b0 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1f0e0 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65          &extende
1f110 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49  dParameters))==I
1f120 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1f130 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28       retryIoerr(
1f160 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1f170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1f180 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
1f190 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
1f1a0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
1f1b0 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
1f1c0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
1f1f0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
1f220 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
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 20 20 20 64 77 43 72              dwCr
1f250 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
1f260 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1f290 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
1f2c0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1f2d0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2f0 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
1f300 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1f310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f320 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
1f330 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69   }.#endif.  }.#i
1f340 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1f350 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1f360 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  e{.    while( (h
1f370 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41   = osCreateFileA
1f380 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72  ((LPCSTR)zConver
1f390 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1f3c0 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
1f3f0 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1f420 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
1f450 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
1f480 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
1f490 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
1f4c0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1f4d0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
1f4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
1f4f0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   */.    }.  }.#e
1f500 6e 64 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28  ndif.  logIoerr(
1f510 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  cnt);..  OSTRACE
1f520 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78  (("OPEN %d %s 0x
1f530 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20  %lx %s\n", .    
1f540 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c         h, zName,
1f550 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1f560 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d  , .           h=
1f570 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1f580 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22  VALUE ? "failed"
1f590 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66   : "ok"));..  if
1f5a0 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1f5b0 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1f5c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1f5d0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
1f5e0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
1f5f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1f600 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1f610 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74  , "winOpen", zUt
1f620 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  f8Name);.    sql
1f630 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1f640 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  rted);.    if( i
1f650 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
1f660 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
1f670 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70      return winOp
1f680 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20  en(pVfs, zName, 
1f690 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28  id, .         ((
1f6a0 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45  flags|SQLITE_OPE
1f6b0 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20  N_READONLY) &.  
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e     ~(SQLITE_OPEN
1f6e0 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
1f6f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c  PEN_READWRITE)),
1f700 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c  .         pOutFl
1f710 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
1f720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f730 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1f740 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
1f750 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
1f760 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
1f770 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  Write ){.      *
1f780 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
1f790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1f7a0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1f7b0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
1f7c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1f7d0 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
1f7e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1f7f0 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
1f800 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
1f810 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1f820 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
1f830 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74  (rc = winceCreat
1f840 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
1f850 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  le))!=SQLITE_OK.
1f860 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
1f870 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
1f880 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1f890 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
1f8a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1f8b0 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
1f8c0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
1f8d0 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
1f8e0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
1f8f0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
1f900 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1f910 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c  ed);.  }..  pFil
1f920 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69  e->pMethod = &wi
1f930 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69  nIoMethod;.  pFi
1f940 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
1f950 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
1f960 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
1f970 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  y ){.    pFile->
1f980 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
1f990 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
1f9a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
1f9b0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
1f9c0 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
1f9d0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1f9e0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
1f9f0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1fa00 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
1fa10 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74   }.  pFile->last
1fa20 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
1fa30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
1fa40 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51   = zName;.#if SQ
1fa50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1fa60 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  ZE>0.  pFile->hM
1fa70 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69  ap = NULL;.  pFi
1fa80 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1fa90 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
1faa0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69  pSize = 0;.  pFi
1fab0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1fac0 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  al = 0;.  pFile-
1fad0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
1fae0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1faf0 69 67 2e 6d 78 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.mxMmap;.#endi
1fb00 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  f..  OpenCounter
1fb10 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
1fb20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
1fb30 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
1fb40 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
1fb50 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20  at Windows does 
1fb60 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
1fb70 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
1fb80 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
1fb90 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
1fba0 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
1fbb0 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
1fbc0 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
1fbd0 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
1fbe0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1fbf0 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
1fc00 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
1fc10 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
1fc20 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
1fc30 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
1fc40 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1fc50 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
1fc60 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
1fc70 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
1fc80 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
1fc90 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
1fca0 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
1fcb0 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
1fcc0 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
1fcd0 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
1fce0 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
1fcf0 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
1fd00 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
1fd10 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
1fd20 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
1fd30 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
1fd40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1fd50 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
1fd60 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1fd70 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
1fd80 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
1fd90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1fda0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
1fdb0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
1fdc0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
1fdd0 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
1fde0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
1fdf0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
1fe00 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
1fe10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
1fe20 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52  ORD attr;.  DWOR
1fe30 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76  D lastErrno;.  v
1fe40 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
1fe50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1fe60 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
1fe70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79  SED_PARAMETER(sy
1fe80 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c  ncDir);..  Simul
1fe90 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
1fea0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
1feb0 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65  ELETE);.  zConve
1fec0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1fed0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
1fee0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
1fef0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
1ff00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ff10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1ff20 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1ff30 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51  .    do {.#if SQ
1ff40 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1ff50 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
1ff60 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
1ff70 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d  ttrData;.      m
1ff80 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
1ff90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
1ffa0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  rData));.      i
1ffb0 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  f ( osGetFileAtt
1ffc0 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76  ributesExW(zConv
1ffd0 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78  erted, GetFileEx
1ffe0 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20  &sAttrData) ){. 
20020 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
20030 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
20040 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
20050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
20060 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
20070 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
20080 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
20090 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
200a0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
200b0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
200c0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
200d0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
200e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
200f0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
20100 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
20110 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
20120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
20130 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20160 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
20170 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
20180 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
20190 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
201a0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
201b0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
201c0 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
201d0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
201e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
201f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
20200 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
20210 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
20220 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
20230 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
20240 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
20250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20260 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
20270 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
20280 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
20290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
202b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
202c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
202d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
202e0 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
202f0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
20300 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20310 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
20320 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
20330 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
20350 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  ( osDeleteFileW(
20360 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
20370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20380 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
20390 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
203a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
203b0 20 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72        if ( !retr
203c0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
203d0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
203e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
203f0 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
20400 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
20410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20420 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
20430 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
20440 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
20450 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
20460 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
20470 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
20480 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
20490 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
204a0 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
204b0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
204c0 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
204d0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
204e0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
204f0 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
20500 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
20510 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
20520 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
20530 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
20540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20550 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
20560 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
20570 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
20580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
205a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
205b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
205c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
205d0 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
205e0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
205f0 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
20600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
20610 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
20620 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
20630 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
20640 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
20650 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
20660 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
20670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
20680 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
20690 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
206a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
206b0 28 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63  ( !retryIoerr(&c
206c0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
206d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
206e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
206f0 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
20700 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
20710 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20720 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
20730 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
20740 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
20750 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
20760 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
20770 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20780 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
20790 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
207a0 20 20 20 20 20 20 22 77 69 6e 44 65 6c 65 74 65        "winDelete
207b0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
207c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49   }else{.    logI
207d0 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20  oerr(cnt);.  }. 
207e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
207f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
20800 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22  RACE(("DELETE \"
20810 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c  %s\" %s\n", zFil
20820 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61  ename, (rc ? "fa
20830 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29  iled" : "ok" )))
20840 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20850 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
20860 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20  e existence and 
20870 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
20880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20890 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
208a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
208b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
208c0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
208d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
208e0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
208f0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
20900 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
20910 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
20920 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
20930 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
20940 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
20950 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
20960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
20970 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
20980 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
20990 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
209a0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
209b0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
209c0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
209d0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
209e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
209f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
20a00 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
20a10 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
20a20 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
20a30 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
20a40 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
20a50 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
20a60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20a70 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
20a80 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
20a90 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
20aa0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
20ab0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
20ac0 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
20ad0 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
20ae0 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
20af0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
20b00 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
20b10 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
20b20 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
20b50 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
20b60 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
20b90 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
20ba0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
20bb0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
20bc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
20bd0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20be0 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61  ISTS query, trea
20bf0 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  t a zero-length 
20c00 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  file.      ** as
20c10 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
20c20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
20c30 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61        if(    fla
20c40 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
20c50 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20  S_EXISTS.       
20c60 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
20c70 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30  nFileSizeHigh==0
20c80 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
20c90 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
20ca0 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  zeLow==0 ){.    
20cb0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
20cc0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
20cd0 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ES;.      }else{
20ce0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
20cf0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
20d00 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
20d10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
20d20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e       logIoerr(cn
20d30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  t);.      if( la
20d40 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
20d50 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
20d60 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
20d70 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
20d80 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c   ){.        winL
20d90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
20da0 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
20db0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
20dc0 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ss", zFilename);
20dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20de0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
20df0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20e00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
20e10 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c  CCESS;.      }el
20e20 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
20e30 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
20e40 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
20e50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
20e60 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
20e70 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
20e80 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
20e90 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
20ea0 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
20eb0 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
20ec0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
20ed0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
20ee0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
20ef0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20f00 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
20f10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
20f20 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
20f30 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
20f40 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
20f50 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
20f60 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
20f70 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
20f80 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
20f90 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
20fa0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
20fb0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
20fc0 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
20fd0 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
20fe0 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
20ff0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
21000 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
21010 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
21020 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
21030 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
21040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21050 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
21060 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
21070 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
21080 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
21090 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
210a0 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
210b0 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
210c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
210d0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
210e0 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
210f0 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
21100 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
21110 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
21120 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
21130 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
21140 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
21150 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
21160 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
21170 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
21180 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
21190 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
211a0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
211b0 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
211c0 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
211d0 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
211e0 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
211f0 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
21200 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
21210 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
21220 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
21230 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
21240 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
21250 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
21260 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
21270 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
21280 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
21290 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
212a0 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
212b0 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
212c0 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
212d0 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
212e0 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
212f0 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
21300 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
21310 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
21320 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
21330 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
21340 20 20 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74    */.  if ( zPat
21350 68 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c  hname[0]=='/' ||
21360 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27   zPathname[0]=='
21370 5c 5c 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  \\' ){.    retur
21380 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
21390 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
213a0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
213b0 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
213c0 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
213d0 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
213e0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
213f0 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
21400 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
21410 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
21420 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
21430 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
21440 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
21450 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
21460 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
21470 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
21480 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
21490 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 49 73    if ( sqlite3Is
214a0 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b  alpha(zPathname[
214b0 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65  0]) && zPathname
214c0 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [1]==':' ){.    
214d0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
214e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  /*.  ** If w
214f0 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  e get to this po
21500 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61  int, the path na
21510 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74  me should almost
21520 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20   certainly be a 
21530 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61  purely.  ** rela
21540 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  tive one (i.e. n
21550 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e  ot a UNC name, n
21560 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64  ot absolute, and
21570 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61   not volume rela
21580 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  tive)..  */.  re
21590 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f  turn FALSE;.}../
215a0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
215b0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
215c0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
215d0 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
215e0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
215f0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
21600 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
21610 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
21620 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
21630 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
21640 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
21650 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
21660 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
21670 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21680 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
21690 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
216a0 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
216b0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
216c0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
216d0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
216e0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
216f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21700 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
21710 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
21720 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21740 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
21750 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ){.  .#if define
21760 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
21770 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
21780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21790 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
217a0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
217b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
217c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d  s->mxPathname>=M
217d0 41 58 5f 50 41 54 48 20 29 3b 0a 20 20 61 73 73  AX_PATH );.  ass
217e0 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
217f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
21800 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
21810 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
21820 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
21830 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
21840 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
21850 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
21860 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
21870 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
21880 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
21890 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
218a0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
218b0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
218c0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
218d0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
218e0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
218f0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
21900 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
21910 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
21920 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
21930 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
21940 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
21950 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
21960 20 63 68 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50   char zOut[MAX_P
21970 41 54 48 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73  ATH+1];.    mems
21980 65 74 28 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f  et(zOut, 0, MAX_
21990 50 41 54 48 2b 31 29 3b 0a 20 20 20 20 63 79 67  PATH+1);.    cyg
219a0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43  win_conv_path(CC
219b0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
219c0 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a  |CCP_RELATIVE, z
219d0 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 0a  Relative, zOut,.
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 20 20 20 20 4d 41 58 5f 50 41 54 48 2b 31 29       MAX_PATH+1)
21a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
21a10 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
21a20 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
21a30 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c  me), zFull, "%s\
21a40 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \%s",.          
21a50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21a60 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
21a70 79 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  y, zOut);.  }els
21a80 65 7b 0a 20 20 20 20 63 79 67 77 69 6e 5f 63 6f  e{.    cygwin_co
21a90 6e 76 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49  nv_path(CCP_POSI
21aa0 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c  X_TO_WIN_A, zRel
21ab0 61 74 69 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46  ative, zFull, nF
21ac0 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ull);.  }.  retu
21ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
21ae0 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
21af0 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
21b00 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
21b10 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
21b20 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
21b30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
21b40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
21b50 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
21b60 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
21b70 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
21b80 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
21b90 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
21ba0 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
21bb0 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
21bc0 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
21bd0 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
21be0 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
21bf0 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
21c00 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
21c10 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
21c20 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
21c30 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
21c40 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
21c50 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
21c60 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
21c70 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
21c80 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
21c90 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
21ca0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
21cb0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
21cc0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
21cd0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
21ce0 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
21cf0 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
21d00 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
21d10 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
21d20 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
21d30 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
21d40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21d50 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
21d60 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
21d70 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25  ), zFull, "%s\\%
21d80 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
21d90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21da0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
21db0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
21dc0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
21dd0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
21de0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
21df0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
21e00 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
21e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
21e20 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
21e30 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
21e40 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
21e50 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
21e60 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
21e70 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65  _).  DWORD nByte
21e80 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
21e90 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
21ea0 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
21eb0 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
21ec0 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
21ed0 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
21ee0 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
21ef0 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
21f00 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
21f10 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
21f20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
21f30 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
21f40 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  /' && sqlite3Isa
21f50 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31  lpha(zRelative[1
21f60 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b  ]) && zRelative[
21f70 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a  2]==':' ){.    z
21f80 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
21f90 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
21fa0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
21fb0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
21fc0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
21fd0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
21fe0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
21ff0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
22000 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
22010 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
22020 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
22030 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
22040 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
22050 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
22060 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
22070 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
22080 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
22090 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
220a0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
220b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
220c0 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
220d0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
220e0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
220f0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
22100 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
22110 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
22120 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
22130 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
22140 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
22150 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
22160 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
22170 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
22180 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
22190 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
221a0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
221b0 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
221c0 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
221d0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
221e0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
221f0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
22200 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
22210 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
22220 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
22230 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
22240 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
22250 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
22260 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s\\%s",.        
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22280 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
22290 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  ory, zRelative);
222a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
222b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f  TE_OK;.  }.  zCo
222c0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
222d0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  tUtf8Filename(zR
222e0 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
222f0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
22300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22310 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22320 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
22330 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a   ){.    LPWSTR z
22340 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
22350 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
22360 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
22370 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
22380 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
22390 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69  e==0 ){.      wi
223a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
223b0 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73  _ERROR, osGetLas
223c0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
223d0 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74              "Get
223e0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 31 22 2c  FullPathNameW1",
223f0 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
22400 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22410 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22430 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
22440 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ATH;.    }.    n
22450 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
22460 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
22470 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
22480 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
22490 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
224a0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
224b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
224c0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
224d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
224e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
224f0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
22500 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
22510 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
22520 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
22530 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
22540 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77  te==0 ){.      w
22550 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22560 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61  E_ERROR, osGetLa
22570 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65               "Ge
22590 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 32 22  tFullPathNameW2"
225a0 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  , zConverted);. 
225b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
225c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
225d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
225e0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
225f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
22600 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b  NTOPEN_FULLPATH;
22610 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22620 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22630 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
22640 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
22650 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
22660 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
22670 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22680 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
22690 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
226a0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
226b0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
226c0 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
226d0 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
226e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
226f0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77  te==0 ){.      w
22700 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22710 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61  E_ERROR, osGetLa
22720 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65               "Ge
22740 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22  tFullPathNameA1"
22750 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  , zConverted);. 
22760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22770 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22780 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22790 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
227a0 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
227b0 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
227c0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
227d0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
227e0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
227f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
22800 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
22810 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
22820 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
22830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22840 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
22850 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
22860 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
22870 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
22880 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
22890 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
228a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69  e==0 ){.      wi
228b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
228c0 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73  _ERROR, osGetLas
228d0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
228e0 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74              "Get
228f0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c  FullPathNameA2",
22900 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
22910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22920 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22930 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22940 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
22950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
22960 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a  TOPEN_FULLPATH;.
22970 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22980 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22990 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73  d);.    zOut = s
229a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
229b0 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
229c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
229d0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
229e0 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
229f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22a00 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
22a10 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
22a20 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
22a30 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
22a40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
22a50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22a60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
22a70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22a80 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22a90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
22aa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22ab0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
22ac0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
22ad0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
22ae0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
22af0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
22b00 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
22b10 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
22b20 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
22b30 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
22b40 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74  ry..*/./*.** Int
22b50 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
22b60 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
22b70 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
22b80 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
22b90 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
22ba0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
22bb0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
22bc0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
22bd0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
22be0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
22bf0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
22c00 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
22c10 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64  HANDLE h;.  void
22c20 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63   *zConverted = c
22c30 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
22c40 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
22c50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22c60 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a  R(pVfs);.  if( z
22c70 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
22c80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22c90 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
22ca0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
22cb0 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73  WINRT.    h = os
22cc0 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
22cd0 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ary((LPCWSTR)zCo
22ce0 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c  nverted, 0);.#el
22cf0 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  se.    h = osLoa
22d00 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53  dLibraryW((LPCWS
22d10 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  TR)zConverted);.
22d20 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
22d30 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
22d40 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
22d50 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
22d60 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
22d70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
22d80 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
22d90 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22da0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
22db0 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
22dc0 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
22dd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22de0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
22df0 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
22e00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
22e10 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72  fs);.  getLastEr
22e20 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
22e30 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
22e40 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
22e50 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
22e60 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
22e70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e  Vfs,void *pH,con
22e80 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
22e90 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  void){.  UNUSED_
22ea0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
22eb0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
22ec0 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72  *)(void))osGetPr
22ed0 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
22ee0 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  LE)pH, zSym);.}.
22ef0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
22f00 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
22f10 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
22f20 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
22f30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
22f40 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
22f50 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
22f60 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
22f70 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
22f80 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
22f90 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
22fa0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
22fb0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
22fc0 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
22fd0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
22fe0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
22ff0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
23000 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
23010 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
23020 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
23030 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
23040 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
23050 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
23060 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
23070 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
23080 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
23090 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
230a0 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
230b0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
230c0 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
230d0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
230e0 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
230f0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
23100 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
23110 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
23120 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
23130 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
23140 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
23150 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
23160 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
23170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
23180 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
23190 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
231a0 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
231b0 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
231c0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
231d0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
231e0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
231f0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
23200 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
23210 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
23220 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
23230 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
23240 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
23250 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
23260 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
23270 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
23280 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
23290 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
232a0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
232b0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
232c0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
232d0 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
232e0 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
232f0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
23300 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
23310 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
23320 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
23330 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
23340 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
23350 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
23360 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
23370 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
23380 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
23390 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
233a0 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
233b0 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
233c0 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
233d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
233e0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
233f0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
23400 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
23410 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
23420 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
23430 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
23440 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23450 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
23460 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
23470 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
23480 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
23490 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
234a0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
234b0 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
234c0 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
234d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
234e0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
234f0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
23500 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
23510 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
23520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
23530 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
23540 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
23550 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
23560 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
23570 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
23580 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
23590 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
235a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
235b0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
235c0 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
235d0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
235e0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
235f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
23600 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
23610 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
23620 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
23630 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
23640 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
23650 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
23660 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
23670 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
23680 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
23690 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
236a0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
236b0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
236c0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
236d0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
236e0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
236f0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
23700 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
23710 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
23720 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
23730 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
23740 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
23750 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
23760 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
23770 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
23780 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
23790 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
237a0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
237b0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
237c0 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
237d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
237e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
237f0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
23800 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
23810 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
23820 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
23830 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
23840 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
23850 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
23860 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
23870 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
23880 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
23890 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
238a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
238b0 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
238c0 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
238d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
238e0 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
238f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
23900 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
23910 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
23920 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
23930 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
23940 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
23950 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
23960 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
23970 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
23980 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
23990 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
239a0 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
239b0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
239c0 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
239d0 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
239e0 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20  )2000000000 +.  
239f0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
23a00 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
23a10 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23a20 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
23a30 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
23a40 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
23a50 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
23a60 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
23a70 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
23a80 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
23a90 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
23aa0 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
23ab0 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
23ac0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23ad0 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
23ae0 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
23af0 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
23b00 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
23b10 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
23b20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
23b30 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
23b40 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
23b50 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
23b60 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
23b70 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
23b80 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
23b90 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
23ba0 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
23bb0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23bc0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
23bd0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
23be0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
23bf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
23c00 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
23c10 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
23c20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
23c30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
23c40 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
23c50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23c60 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
23c70 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
23c80 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
23c90 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
23ca0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
23cb0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
23cc0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
23cd0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
23ce0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
23cf0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
23d00 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
23d10 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
23d20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23d30 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
23d40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
23d50 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
23d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
23d70 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
23d80 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
23d90 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
23da0 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
23db0 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
23dc0 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
23dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23de0 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
23df0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
23e00 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
23e10 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
23e20 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
23e30 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
23e40 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
23e50 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
23e60 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
23e70 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
23e80 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
23e90 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
23ea0 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
23eb0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
23ec0 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
23ed0 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
23ee0 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
23ef0 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
23f00 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
23f10 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
23f20 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
23f30 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
23f40 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
23f50 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
23f60 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
23f70 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
23f80 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
23f90 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
23fa0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23fb0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
23fc0 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
23fd0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
23fe0 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
23ff0 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
24000 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24010 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
24020 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
24030 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
24040 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
24050 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
24060 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
24070 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
24080 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
24090 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
240a0 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
240b0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
240c0 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
240d0 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
240e0 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
240f0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24100 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
24110 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
24120 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
24130 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
24140 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
24150 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
24160 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
24170 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
24180 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
24190 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
241a0 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
241b0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
241c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
241d0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
241e0 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
241f0 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
24200 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
24210 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
24220 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
24230 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
24240 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
24250 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
24260 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
24270 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
24280 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
24290 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
242a0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
242b0 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
242c0 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
242d0 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
242e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
242f0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
24300 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
24310 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
24320 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
24330 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
24340 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c  );.  return getL
24350 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
24360 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
24370 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
24380 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
24390 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
243a0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
243b0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
243c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
243d0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
243e0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
243f0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
24400 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
24410 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
24420 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
24430 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
24440 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
24450 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20    MAX_PATH,     
24460 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
24470 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
244a0 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
244b0 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
244c0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
244d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
244e0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
244f0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
24500 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
24510 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
24520 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
24530 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
24540 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
24550 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
24560 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
24570 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
24580 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
24590 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
245a0 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
245b0 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
245c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
245d0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
245e0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
245f0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
24600 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
24610 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
24620 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
24630 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
24640 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
24650 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
24660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24670 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
24680 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
24690 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
246a0 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
246b0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
246c0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
246d0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
246e0 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
246f0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
24700 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
24710 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
24720 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
24730 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
24740 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
24750 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
24760 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
24770 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
24780 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
24790 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  ;..  /* Double-c
247a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
247b0 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
247c0 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
247d0 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
247e0 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
247f0 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
24800 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
24810 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
24820 61 6c 6c 29 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f  all)==74 );..  /
24830 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70  * get memory map
24840 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e   allocation gran
24850 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d  ularity */.  mem
24860 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c  set(&winSysInfo,
24870 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45   0, sizeof(SYSTE
24880 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51  M_INFO));.#if SQ
24890 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
248a0 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
248b0 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
248c0 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65  o);.#else.  osGe
248d0 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  tSystemInfo(&win
248e0 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  SysInfo);.#endif
248f0 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
24900 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
24910 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20  onGranularity>0 
24920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  );.  assert( win
24930 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
24940 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ze>0 );..  sqlit
24950 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
24960 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72  &winVfs, 1);.  r
24970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24980 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
24990 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
249a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
249b0 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
249c0 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
249d0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
249e0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
249f0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
24a00 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
24a10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24a20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24a30 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.