/ Hex Artifact Content
Login

Artifact 46d2bbad7a65d2867ec0e9afb4aa28478402e9dc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
1360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1370: 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69  ndle for accessi
1380: 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ng memory mappin
1390: 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61  g */.  void *pMa
13a0: 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 2f  pRegion;       /
13b0: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
13c0: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
13d0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
13e0: 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 78 4d 72  ; /* Size of xMr
13f0: 65 6d 61 70 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  emap() */.};../*
1400: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
1410: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
1420: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
1430: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  ine WINFILE_RDON
1440: 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30 32  LY          0x02
1450: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1460: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
1470: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
1480: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20  _PERSIST_WAL    
1490: 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69   0x04   /* Persi
14a0: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
14b0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
14c0: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20 20  E_PSOW          
14d0: 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49    0x10   /* SQLI
14e0: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
14f0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
1500: 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20  ./*. * The size 
1510: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73  of the buffer us
1520: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69  ed by sqlite3_wi
1530: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
1540: 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ).. */.#ifndef S
1550: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
1560: 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  BUF_SIZE.#  defi
1570: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1580: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28  DBG_BUF_SIZE   (
1590: 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f  (int)(4096-sizeo
15a0: 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69  f(DWORD))).#endi
15b0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
15c0: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
15d0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
15e0: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
15f0: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
1600: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
1610: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
1620: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
1630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1640: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1650: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1660: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
1670: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a  ECTORY_TYPE (1).
1680: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
1690: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
16a0: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
16b0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
16c0: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
16d0: 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79   * the temporary
16e0: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
16f0: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
1700: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1710: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
1720: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
1730: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1740: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
1750: 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66  _TYPE (2).#endif
1760: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
1770: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
1780: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20  WIN32_MALLOC on 
1790: 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c  Windows, we will
17a0: 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69   use the. * vari
17b0: 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65  ous Win32 API he
17c0: 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73  ap functions ins
17d0: 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  tead of our own.
17e0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
17f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
1800: 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69  ./*. * If this i
1810: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69  s non-zero, an i
1820: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
1830: 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20  l be created by 
1840: 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32  the native Win32
1850: 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75  . * allocator su
1860: 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69  bsystem; otherwi
1870: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
1880: 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c  process heap wil
1890: 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73  l be used.  This
18a0: 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20  . * setting has 
18b0: 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63  no effect when c
18c0: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e  ompiling for Win
18d0: 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  RT.  By default,
18e0: 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64   this is enabled
18f0: 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61  . * and an isola
1900: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
1910: 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72   created to stor
1920: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20  e all allocated 
1930: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a  data.. *. ******
1940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1980: 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e  ********. * WARN
1990: 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72  ING: It is impor
19a0: 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61  tant to note tha
19b0: 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74  t when this sett
19c0: 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ing is non-zero 
19d0: 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20  and the. *      
19e0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
19f0: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  wn function is c
1a00: 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74  alled (e.g. by t
1a10: 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  he sqlite3_shutd
1a20: 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20  own. *          
1a30: 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64  function), all d
1a40: 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c  ata that was all
1a50: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
1a60: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1a70: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ill. *          
1a80: 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61  be freed immedia
1a90: 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74  tely and any att
1aa0: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
1ab0: 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64  ny of that freed
1ac0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  . *          dat
1ad0: 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65  a will almost ce
1ae0: 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69  rtainly result i
1af0: 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61  n an immediate a
1b00: 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e  ccess violation.
1b10: 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . **************
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1b70: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
1b80: 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20  REATE.#  define 
1b90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1ba0: 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55  P_CREATE    (TRU
1bb0: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
1bc0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   The initial siz
1bd0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1be0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1bf0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1c00: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1c10: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1c20: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  HEAP_INIT_SIZE.#
1c30: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1c40: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
1c50: 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45  SIZE ((SQLITE_DE
1c60: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1c70: 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) * \.          
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
1ca0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1cb0: 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30  E_SIZE) + 419430
1cc0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  4).#endif../*. *
1cd0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
1ce0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1cf0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1d00: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1d10: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1d20: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1d30: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20  HEAP_MAX_SIZE.# 
1d40: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1d50: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1d60: 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a  ZE  (0).#endif..
1d70: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
1d80: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
1d90: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
1da0: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
1db0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1dc0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
1dd0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1de0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
1df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1e00: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
1e10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1e20: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29  AP_FLAGS     (0)
1e30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1e40: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
1e50: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
1e60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
1e70: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
1e80: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
1e90: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
1ea0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1eb0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1ec0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1ed0: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
1ee0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69   winMemData {.#i
1ef0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
1f00: 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20  32 magic;    /* 
1f10: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
1f20: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
1f30: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
1f40: 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20  #endif.  HANDLE 
1f50: 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61  hHeap; /* The ha
1f60: 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70  ndle to our heap
1f70: 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e  . */.  BOOL bOwn
1f80: 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77  ed;  /* Do we ow
1f90: 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e  n the heap (i.e.
1fa0: 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73   destroy it on s
1fb0: 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a  hutdown)? */.};.
1fc0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1fd0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
1fe0: 41 47 49 43 20 20 20 20 20 30 78 34 32 62 32 38  AGIC     0x42b28
1ff0: 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  30b.#endif..stat
2000: 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ic struct winMem
2010: 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  Data win_mem_dat
2020: 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  a = {.#ifndef ND
2030: 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41  EBUG.  WINMEM_MA
2040: 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55  GIC,.#endif.  NU
2050: 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69  LL, FALSE.};..#i
2060: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
2070: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2080: 74 4d 61 67 69 63 28 29 20 61 73 73 65 72 74 28  tMagic() assert(
2090: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61   win_mem_data.ma
20a0: 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  gic==WINMEM_MAGI
20b0: 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  C ).#else.#defin
20c0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
20d0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
20e0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
20f0: 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61  eap() win_mem_da
2100: 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63  ta.hHeap..static
2110: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
2120: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
2130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2140: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
2150: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
2160: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
2170: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
2180: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
2190: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
21a0: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
21b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
21c0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
21d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
21e0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
21f0: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
2200: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
2210: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
2220: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
2230: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
2240: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
2250: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
2260: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2270: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
2280: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2290: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
22a0: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
22b0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
22c0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
22d0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
22e0: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
22f0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
2300: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
2310: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
2320: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
2330: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
2340: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
2350: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
2360: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2370: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
2380: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
2390: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
23a0: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
23b0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
23c0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
23d0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
23e0: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
23f0: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
2400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2420: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
2430: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
2440: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
2450: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 0;.#endif..#if
2460: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
2470: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
2480: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2490: 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  tr.#endif../*.**
24a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24b0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
24c0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72  on Windows CE or
24d0: 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66   WinRT.. */..#if
24e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24f0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
2500: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  NRT.#  define os
2510: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
2520: 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66  )       1.#endif
2530: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2540: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2550: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2560: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2570: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2580: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2590: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
25a0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
25b0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
25c0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
25d0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
25e0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
25f0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2600: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2610: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2620: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2630: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2640: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
2650: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2660: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2670: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2680: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
2690: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
26a0: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
26b0: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
26c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
26d0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
26e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
26f0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
2700: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
2710: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
2720: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2730: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2740: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72  OS_WINRT.  { "Ar
2750: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
2760: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2770: 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  )AreFileApisANSI
2780: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
2790: 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c  else.  { "AreFil
27a0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
27b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
27e0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65  f..#ifndef osAre
27f0: 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65  FileApisANSI.#de
2800: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
2810: 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49  isANSI ((BOOL(WI
2820: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
2830: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
2840: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
2850: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
2860: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2870: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2880: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
2890: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
28a0: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
28b0: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
28c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
28d0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
28f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2910: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2920: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
2930: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
2940: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
2950: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
2960: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2970: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2990: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
29a0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
29b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
29c0: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
29d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
29e0: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
29f0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
2a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2a30: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
2a40: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
2a50: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
2a60: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
2a70: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
2a80: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
2a90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2aa0: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
2ab0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2ac0: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
2ad0: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
2ae0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
2af0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2b00: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2b10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b20: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
2b30: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
2b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2b50: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
2b60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2b70: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2b80: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2b90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2bc0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2bd0: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
2be0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
2bf0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
2c00: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
2c10: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
2c20: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
2c30: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
2c40: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
2c50: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
2c60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2c70: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2c80: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2ca0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2cb0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
2cc0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2cd0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
2ce0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cf0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2d00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2d10: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2d20: 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28  osCreateFileW ((
2d30: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2d40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
2d50: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
2d60: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2d70: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
2d80: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
2d90: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[5].pCurrent)..
2da0: 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f  #if (!SQLITE_OS_
2db0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
2dc0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2dd0: 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20  S_ANSI) && \.   
2de0: 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51       !defined(SQ
2df0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
2e00: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2e10: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
2e20: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2e30: 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20  leMappingA,     
2e40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2e50: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2e60: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
2e70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2e90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2ea0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2eb0: 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28  ppingA ((HANDLE(
2ec0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
2ed0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
2ee0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
2ef0: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
2f00: 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63  RD,LPCSTR))aSysc
2f10: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
2f20: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2f30: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
2f40: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2f60: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
2f70: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
2f80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
2f90: 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  AL)).  { "Create
2fa0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2fb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2fc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2fd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2fe0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2ff0: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3000: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3030: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3040: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
3050: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
3060: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
3070: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
3080: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
3090: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
30a0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
30b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
30c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
30d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
30e0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
30f0: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
3100: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3110: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
3120: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
3130: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3140: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3150: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3160: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3170: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3180: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3190: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
31a0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
31b0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
31c0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
31d0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
31e0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
31f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3200: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3210: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3220: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
3230: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3240: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
3250: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
3270: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
3280: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
32b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
32c0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
32d0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
32e0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
32f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3310: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3320: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
3330: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3340: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
3350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3360: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3370: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
3380: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3390: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
33a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
33b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
33c0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
33d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
33e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
33f0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3400: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3410: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
3420: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
3430: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
3440: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3450: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
3460: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
3470: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
3480: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
34a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
34b0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
34c0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
34d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
34e0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
34f0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
3500: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
3510: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3520: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3530: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
3540: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
3550: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
3560: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
3570: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3580: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
3590: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
35a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
35c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
35d0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
35e0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
35f0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
3600: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
3610: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
3620: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
3630: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3640: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
3650: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3660: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
3670: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
3680: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
3690: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
36a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
36b0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
36c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
36d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
36e0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
36f0: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
3700: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
3710: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
3720: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
3730: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3780: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3790: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
37a0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
37b0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
37c0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
37d0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
37e0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
37f0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3800: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3810: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3820: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
3830: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
3840: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3850: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
3870: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
3880: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
3890: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
38c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
38d0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
38e0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
38f0: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
3900: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
3910: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
3920: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
3930: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
3940: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
3960: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
3970: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
3980: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3990: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
39b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
39c0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
39d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
39e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3a00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
3a10: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
3a20: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
3a30: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
3a60: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
3a70: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
3a80: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
3a90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3aa0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
3ab0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3ac0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
3ad0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3ae0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3af0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b10: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
3b20: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
3b30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3b40: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3b50: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
3b60: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
3b70: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
3b80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3bb0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
3bc0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
3bd0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3be0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3bf0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3c00: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3c10: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3c30: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3c50: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3c60: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3c70: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
3c80: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
3c90: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
3ca0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
3cb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3cc0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3cd0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
3ce0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3d10: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
3d20: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
3d30: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3d40: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3d50: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3d60: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
3d70: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3d80: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3d90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3da0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3db0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
3dc0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3dd0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3de0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
3df0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3e00: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
3e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3e50: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
3e60: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3e70: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3e80: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3e90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3ea0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3eb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3ec0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3ed0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3ee0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3ef0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3f00: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
3f10: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3f20: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3f30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3f60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
3f70: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
3f80: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
3f90: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3fa0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
3fb0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3fc0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3fd0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3fe0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3ff0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4000: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
4010: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4020: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4030: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4040: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4070: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4080: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
4090: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
40a0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
40b0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
40c0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
40d0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
40e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40f0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4100: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
4110: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4120: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4140: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4150: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4160: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4180: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4190: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
41a0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
41b0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
41c0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
41d0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
41e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
41f0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4200: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4210: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4220: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4230: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4240: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
4250: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
4260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4270: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
4280: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
42b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
42c0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
42d0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
42e0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
42f0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
4300: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
4310: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
4320: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4330: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4340: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4350: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4360: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4370: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
4380: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
4390: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
43a0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
43b0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
43c0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
43d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4400: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4410: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
4420: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4430: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
4440: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4450: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
4460: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
4470: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
4480: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
4490: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
44a0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
44b0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
44c0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
44d0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
44e0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
44f0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
4500: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4510: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
4520: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
4530: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
4540: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
4550: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
4560: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
4570: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
4580: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4590: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
45a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
45b0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
45c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
45d0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
45e0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
45f0: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
4600: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
4610: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
4620: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
4630: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
4640: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
4650: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
4660: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4670: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
4680: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4690: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
46a0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
46b0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
46c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
46e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
46f0: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
4700: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
4710: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
4720: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4730: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
4740: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4750: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4760: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
4770: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
4780: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
4790: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
47a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
47b0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
47c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
47d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
47f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4800: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
4810: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
4820: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
4830: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
4840: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4850: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4860: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4870: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
4880: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4890: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
48a0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
48b0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
48c0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
48d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
48e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
48f0: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
4900: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
4910: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
4920: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4930: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4940: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
4950: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
49a0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
49b0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
49c0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
49d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
49e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
49f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a00: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4a10: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a20: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4a30: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a40: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
4a50: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a60: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
4a70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4a80: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4aa0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ab0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
4ac0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4ad0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
4ae0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
4af0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4b00: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4b10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4b20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4b30: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
4b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4b50: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
4b60: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
4b70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4b80: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
4b90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4ba0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4bb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4bc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4bd0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
4be0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4bf0: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
4c00: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
4c10: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4c20: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4c30: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c50: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
4c80: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4cd0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
4ce0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
4cf0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
4d00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4d20: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4d30: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
4d40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4d50: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
4d60: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
4d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4d80: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
4d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4da0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4dc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4dd0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
4de0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4df0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
4e00: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
4e10: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
4e20: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
4e30: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
4e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4e50: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
4e60: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4e70: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
4e80: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
4e90: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
4ea0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4eb0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
4ec0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ed0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4ee0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4f00: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
4f10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4f20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f30: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
4f40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4f80: 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28   osHeapCreate ((
4f90: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4fa0: 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a  DWORD,SIZE_T, \.
4fb0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
4fc0: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
4fd0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4fe0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4ff0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5010: 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79  CALL)HeapDestroy
5020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5030: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5040: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
5050: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5060: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5070: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5080: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5090: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
50a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
50b0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
50c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
50d0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
50f0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5110: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5120: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
5130: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5140: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
5150: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
5160: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
5170: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
5180: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5190: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
51a0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
51b0: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
51c0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
51d0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
51e0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
51f0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5200: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
5210: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
5220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5230: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
5240: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5250: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5260: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
5270: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
5280: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
5290: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
52a0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
52b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
52c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
52d0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
52e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
52f0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
5300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5310: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
5320: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
5330: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5340: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5350: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5360: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5370: 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42  HeapValidate ((B
5380: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5390: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
53a0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
53b0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
53c0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
53d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
53e0: 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66  AS_ANSI) && !def
53f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5400: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
5410: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
5420: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
5430: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
5440: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
5450: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5460: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
5470: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5480: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
54a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
54b0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
54c0: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
54d0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
54e0: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
54f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5500: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5510: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5520: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5530: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
5540: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
5550: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
5560: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
5570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5580: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
5590: 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yW,            0
55a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
55b0: 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20  oadLibraryW",   
55c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
55d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
55e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5600: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28  osLoadLibraryW (
5610: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
5620: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
5630: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
5640: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5650: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
5660: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
5670: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5680: 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20  LocalFree,      
5690: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
56a0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72  lse.  { "LocalFr
56b0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
56c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
56f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61  ..#define osLoca
5700: 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57  lFree ((HLOCAL(W
5710: 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29  INAPI*)(HLOCAL))
5720: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
5730: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5740: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5750: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5760: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
5790: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
57a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
57b0: 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20   "LockFile",    
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
57d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
5800: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64  ef osLockFile.#d
5810: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
5820: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5830: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
5840: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
5850: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
5860: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
5870: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  t).#endif..#if !
5880: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
5890: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
58a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
58b0: 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65  SYSCALL)LockFile
58c0: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ex,             
58d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
58e0: 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  "LockFileEx",   
58f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5900: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5920: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
5930: 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23  f osLockFileEx.#
5940: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
5950: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
5960: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5970: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5980: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5990: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
59a0: 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e  call[46].pCurren
59b0: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
59c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
59d0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
59e0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
59f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
5a00: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
5a10: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5a20: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
5a30: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
5a40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5a50: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
5a60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5a70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5a90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5aa0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
5ab0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
5ac0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5ad0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
5ae0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5af0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70  ))aSyscall[47].p
5b00: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
5b10: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
5b20: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
5b30: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
5b40: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
5b50: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
5b60: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
5b70: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
5b80: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
5b90: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
5ba0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
5bb0: 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74  all[48].pCurrent
5bc0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
5bd0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
5be0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
5bf0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5c00: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
5c10: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
5c20: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
5c30: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5c40: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
5c50: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
5c60: 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  49].pCurrent).. 
5c70: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5c90: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5cc0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
5cd0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5ce0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
5cf0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5d00: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5d10: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
5d20: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
5d30: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
5d40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
5d50: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
5d60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5d70: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
5d80: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5d90: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
5da0: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
5db0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5dc0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
5dd0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
5de0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5df0: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
5e00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5e10: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
5e20: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
5e30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e60: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
5e70: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
5e80: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5e90: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
5ea0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5ed0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5ee0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5f00: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5f20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
5f30: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
5f40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5f50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5f60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5f80: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
5f90: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
5fa0: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
5fb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
5fc0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
5fd0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
5fe0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
5ff0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
6000: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
6010: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
6020: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
6030: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
6040: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
6050: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
6060: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6070: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6080: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
6090: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
60a0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
60b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
60c0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
60d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
60e0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
60f0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
6100: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6130: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
6140: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
6150: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
6160: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6170: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6180: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6190: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
61a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
61b0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
61c0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
61d0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
61e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
61f0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
6200: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6210: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
6220: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
6230: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6260: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
6270: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
6280: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6290: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
62a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
62b0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
62c0: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
62d0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
62e0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
62f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6300: 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70  _WAL).  { "Unmap
6310: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6320: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
6330: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  mapViewOfFile,  
6340: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6350: 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77  e.  { "UnmapView
6360: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
6370: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
63a0: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56  #define osUnmapV
63b0: 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  iewOfFile ((BOOL
63c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49  (WINAPI*)(LPCVOI
63d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
63e0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
63f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
6400: 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41  yte",     (SYSCA
6410: 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  LL)WideCharToMul
6420: 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c  tiByte,     0 },
6430: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65  ..#define osWide
6440: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20  CharToMultiByte 
6450: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
6460: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  INT,DWORD,LPCWST
6470: 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c  R,int,LPSTR,int,
6480: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
6490: 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61  R,LPBOOL))aSysca
64a0: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
64b0: 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65  ..  { "WriteFile
64c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
64d0: 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46   (SYSCALL)WriteF
64e0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
64f0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6500: 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42   osWriteFile ((B
6510: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6520: 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  DLE,LPCVOID,DWOR
6530: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
6540: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6550: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e  D))aSyscall[59].
6560: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6570: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6580: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
6590: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  xW",          (S
65a0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65  YSCALL)CreateEve
65b0: 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  ntExW,          
65c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
65d0: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c  CreateEventExW",
65e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6600: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6610: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6620: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
6630: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
6640: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
6650: 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54  TTRIBUTES,LPCWST
6660: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
6670: 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  RD,DWORD))aSysca
6680: 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[60].pCurrent)
6690: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
66a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66b0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22  ForSingleObject"
66c0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57  ,     (SYSCALL)W
66d0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
66e0: 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ct,     0 },.#el
66f0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6700: 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20  ingleObject",   
6710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6740: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6750: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28  orSingleObject (
6760: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6770: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
6780: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6790: 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[61].pCurrent).
67a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
67b0: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
67c0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22  rSingleObjectEx"
67d0: 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69  ,   (SYSCALL)Wai
67e0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
67f0: 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  Ex,   0 },.#else
6800: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
6810: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
6820: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6850: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
6860: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28  SingleObjectEx (
6870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6880: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6890: 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53          BOOL))aS
68a0: 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72  yscall[62].pCurr
68b0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
68d0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
68e0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
68f0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
6900: 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  Ex,        0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
6920: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
6970: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28  tFilePointerEx (
6980: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6990: 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45  ANDLE,LARGE_INTE
69a0: 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50  GER, \.        P
69b0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57  LARGE_INTEGER,DW
69c0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  ORD))aSyscall[63
69d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
69e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
69f0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
6a00: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6a10: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  Ex", (SYSCALL)Ge
6a20: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6a30: 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c  ByHandleEx, 0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
6a50: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
6a60: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
6a70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6aa0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6ab0: 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f  nByHandleEx ((BO
6ac0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ad0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49  LE, \.        FI
6ae0: 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c  LE_INFO_BY_HANDL
6af0: 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44  E_CLASS,LPVOID,D
6b00: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
6b10: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6b20: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6b30: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
6b40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
6b50: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6b60: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
6b70: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6b80: 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20  FileFromApp,    
6b90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6ba0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
6bb0: 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41  mApp",    (SYSCA
6bc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6be0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6bf0: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6c00: 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44  FromApp ((LPVOID
6c10: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6c20: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20  ,ULONG,ULONG64, 
6c30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6c40: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
6c50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6c60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6c70: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6c90: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
6ca0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  2,             0
6cb0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
6cc0: 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20  reateFile2",    
6cd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ce0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6cf0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d10: 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28  osCreateFile2 ((
6d20: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
6d30: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
6d40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6d50: 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c       LPCREATEFIL
6d60: 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
6d70: 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c  METERS))aSyscall
6d80: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
6d90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6da0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6db0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
6dc0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
6dd0: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
6de0: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
6df0: 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64  ALL)LoadPackaged
6e00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d  Library,     0 }
6e10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6e20: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
6e30: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6e40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6e50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6e60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6e70: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
6e80: 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ary ((HMODULE(WI
6e90: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20  NAPI*)(LPCWSTR, 
6ea0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6eb0: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
6ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
6ed0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6ee0: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
6ef0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6f00: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
6f10: 74 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20  t64,          0 
6f20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6f30: 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20  tTickCount64",  
6f40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6f50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6f60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6f70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6f80: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20  sGetTickCount64 
6f90: 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41  ((ULONGLONG(WINA
6fa0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
6fb0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
6fc0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6fd0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e  _WINRT.  { "GetN
6fe0: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
6ff0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ,     (SYSCALL)G
7000: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7010: 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  fo,     0 },.#el
7020: 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76  se.  { "GetNativ
7030: 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  eSystemInfo",   
7040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7070: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61  .#define osGetNa
7080: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28  tiveSystemInfo (
7090: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
70a0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
70b0: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
70c0: 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[69].pCurrent).
70d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
70e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
70f0: 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  SI).  { "OutputD
7100: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
7110: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
7120: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20  utDebugStringA, 
7130: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7140: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7150: 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28  StringA",      (
7160: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7190: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
71a0: 62 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49  bugStringA ((VOI
71b0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
71c0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  R))aSyscall[70].
71d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
71e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
71f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
7200: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
7210: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
7220: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
7230: 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30  gStringW,      0
7240: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
7250: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7260: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
7270: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7280: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7290: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
72a0: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
72b0: 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41  ingW ((VOID(WINA
72c0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
72d0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
72e0: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72  ent)..  { "GetPr
72f0: 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20  ocessHeap",     
7300: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
7310: 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20  tProcessHeap,   
7320: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7330: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73  fine osGetProces
7340: 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57  sHeap ((HANDLE(W
7350: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
7360: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
7370: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7380: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
73a0: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61  T_WAL).  { "Crea
73b0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
73c0: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
73d0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
73e0: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
73f0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7400: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
7410: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7440: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7450: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
7460: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
7470: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
7480: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
7490: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
74a0: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
74b0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
74c0: 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  73].pCurrent)..}
74d0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
74e0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
74f0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
7500: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7510: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
7520: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
7530: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
7540: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
7550: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
7560: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
7570: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
7580: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
7590: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
75a0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
75b0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
75c0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
75d0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
75e0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
75f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
7600: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
7610: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
7620: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
7630: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
7640: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
7650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7670: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
7680: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
7690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
76a0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
76b0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
76c0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
76d0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
76e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
76f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7700: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
7710: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7720: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7730: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
7740: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
7750: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
7760: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
7770: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
7780: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
7790: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
77a0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
77b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
77c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
77d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
77e0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
77f0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
7800: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7810: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
7820: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7830: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
7840: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
7850: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7860: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
7870: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
7880: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
7890: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
78a0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
78b0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
78c0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
78d0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
78e0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
78f0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7900: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7910: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7920: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
7930: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
7940: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
7950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
7960: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
7970: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
7980: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
7990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
79a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
79b0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
79c0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
79d0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
79e0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
79f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7a00: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
7a10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7a50: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
7a60: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
7a70: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
7a80: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
7a90: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
7aa0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
7ab0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
7ac0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
7ad0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
7ae0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
7b00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
7b10: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
7b20: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
7b30: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
7b40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
7b50: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
7b60: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
7b70: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
7b80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
7b90: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
7ba0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
7bb0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
7bc0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
7bd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7be0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
7bf0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
7c00: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
7c10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
7c20: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7c30: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7c40: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
7c50: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
7c60: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
7c70: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
7c80: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
7c90: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
7ca0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
7cb0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
7cc0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
7cd0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
7ce0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
7cf0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
7d00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7d10: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
7d20: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
7d30: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
7d40: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
7d50: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
7d60: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
7d70: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
7d80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
7d90: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
7da0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
7db0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7dc0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7dd0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
7de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
7df0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
7e00: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
7e10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
7e20: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7e30: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
7e40: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
7e50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7e70: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
7e80: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
7e90: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
7ea0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
7eb0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
7ec0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
7ed0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
7ee0: 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61  _debug(const cha
7ef0: 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75  r *zBuf, int nBu
7f00: 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42  f){.  char zDbgB
7f10: 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  uf[SQLITE_WIN32_
7f20: 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20  DBG_BUF_SIZE];. 
7f30: 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
7f40: 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49  nBuf, (SQLITE_WI
7f50: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7f60: 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62   - 1)); /* may b
7f70: 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20  e negative. */. 
7f80: 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e   if( nMin<-1 ) n
7f90: 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c  Min = -1; /* all
7fa0: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   negative values
7fb0: 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20   become -1. */. 
7fc0: 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d   assert( nMin==-
7fd0: 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20  1 || nMin==0 || 
7fe0: 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33  nMin<SQLITE_WIN3
7ff0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29  2_DBG_BUF_SIZE )
8000: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
8010: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
8020: 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  NSI).  if( nMin>
8030: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
8040: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
8050: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8060: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
8070: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
8080: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f  , nMin);.    osO
8090: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
80a0: 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  A(zDbgBuf);.  }e
80b0: 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75  lse{.    osOutpu
80c0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42  tDebugStringA(zB
80d0: 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64  uf);.  }.#elif d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
80f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
8100: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
8110: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8120: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
8130: 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74   if ( osMultiByt
8140: 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20  eToWideChar(.   
8150: 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65         osAreFile
8160: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
8170: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20  ACP : CP_OEMCP, 
8180: 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
8190: 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52     nMin, (LPWSTR
81a0: 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45  )zDbgBuf, SQLITE
81b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
81c0: 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52  IZE/sizeof(WCHAR
81d0: 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))<=0 ){.    ret
81e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74  urn;.  }.  osOut
81f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28  putDebugStringW(
8200: 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66  (LPCWSTR)zDbgBuf
8210: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e  );.#else.  if( n
8220: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
8230: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
8240: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8250: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
8260: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
8270: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
8280: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
8290: 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b   "%s", zDbgBuf);
82a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
82b0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
82c0: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  s", zBuf);.  }.#
82d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
82e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
82f0: 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68  tine suspends th
8300: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
8310: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73   for at least ms
8320: 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  .** milliseconds
8330: 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76  .  This is equiv
8340: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e  alent to the Win
8350: 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72  32 Sleep() inter
8360: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  face..*/.#if SQL
8370: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61  ITE_OS_WINRT.sta
8380: 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70  tic HANDLE sleep
8390: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  Obj = NULL;.#end
83a0: 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  if..void sqlite3
83b0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f  _win32_sleep(DWO
83c0: 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  RD milliseconds)
83d0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
83e0: 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65  WINRT.  if ( sle
83f0: 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj==NULL ){. 
8400: 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73     sleepObj = os
8410: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e  CreateEventExW(N
8420: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54  ULL, NULL, CREAT
8430: 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52  E_EVENT_MANUAL_R
8440: 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ESET,.          
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a        SYNCHRONIZ
8470: 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  E);.  }.  assert
8480: 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
8490: 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53   );.  osWaitForS
84a0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c  ingleObjectEx(sl
84b0: 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63  eepObj, millisec
84c0: 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65  onds, FALSE);.#e
84d0: 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69  lse.  osSleep(mi
84e0: 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e  lliseconds);.#en
84f0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
8500: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
8510: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
8520: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
8530: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
8540: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
8550: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
8560: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
8570: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
8580: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
8590: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
85a0: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
85b0: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
85c0: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
85d0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
85e0: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
85f0: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
8600: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
8610: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
8620: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
8630: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
8640: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
8650: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
8660: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
8670: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
8680: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
8690: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
86a0: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
86b0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
86c0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
86d0: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
86e0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
86f0: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
8700: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
8710: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
8720: 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54  RT.# define isNT
8730: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
8740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8750: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
8760: 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28  define isNT()  (
8770: 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69  0).#else.  stati
8780: 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29  c int isNT(void)
8790: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
87a0: 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  3_os_type==0 ){.
87b0: 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49        OSVERSIONI
87c0: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
87d0: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
87e0: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
87f0: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
8800: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
8810: 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xA(&sInfo);.    
8820: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70    sqlite3_os_typ
8830: 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74  e = sInfo.dwPlat
8840: 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54  formId==VER_PLAT
8850: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20  FORM_WIN32_NT ? 
8860: 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 : 1;.    }.   
8870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8880: 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a  os_type==2;.  }.
8890: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
88a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
88b0: 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  OC./*.** Allocat
88c0: 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  e nBytes of memo
88d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
88e0: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
88f0: 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20  (int nBytes){.  
8900: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
8910: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
8920: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8930: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8940: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8950: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8960: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8970: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8980: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8990: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
89a0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
89b0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
89c0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
89d0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
89e0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
89f0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8a00: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
8a10: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
8a20: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
8a30: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
8a40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8a50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
8a60: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
8a70: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
8a80: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
8a90: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
8aa0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
8ab0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
8ac0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
8ad0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
8ae0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
8af0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
8b00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8b10: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
8b20: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
8b30: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
8b40: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
8b50: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
8b60: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8b70: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8b80: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8b90: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8ba0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8bb0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8bc0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8bd0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8be0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
8bf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
8c00: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
8c10: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
8c20: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
8c30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8c40: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
8c50: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
8c60: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b  pPrior ) return;
8c70: 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c   /* Passing NULL
8c80: 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20   to HeapFree is 
8c90: 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20  undefined. */.  
8ca0: 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28  if( !osHeapFree(
8cb0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8cc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8cd0: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73  pPrior) ){.    s
8ce0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
8cf0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
8d00: 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f   to HeapFree blo
8d10: 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70  ck %p (%d), heap
8d20: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
8d30: 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73        pPrior, os
8d40: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
8d50: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
8d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8d70: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  ge the size of a
8d80: 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72  n existing memor
8d90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  y allocation.*/.
8da0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
8db0: 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  MemRealloc(void 
8dc0: 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79  *pPrior, int nBy
8dd0: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
8de0: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
8df0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
8e00: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
8e10: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8e20: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8e30: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
8e40: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
8e50: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
8e60: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
8e70: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
8e80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8e90: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8ea0: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8eb0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
8ec0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8ed0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
8ee0: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  r) );.#endif.  a
8ef0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
8f00: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f   );.  if( !pPrio
8f10: 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  r ){.    p = osH
8f20: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
8f30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8f40: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
8f50: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  )nBytes);.  }els
8f60: 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  e{.    p = osHea
8f70: 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  pReAlloc(hHeap, 
8f80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8f90: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c  P_FLAGS, pPrior,
8fa0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
8fb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29  ;.  }.  if( !p )
8fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
8fd0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
8fe0: 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75  "failed to %s %u
8ff0: 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61   bytes (%d), hea
9000: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
9010: 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20         pPrior ? 
9020: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20  "HeapReAlloc" : 
9030: 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79  "HeapAlloc", nBy
9040: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
9050: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
9060: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9070: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
9080: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
9090: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
90a0: 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  f an outstanding
90b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
90c0: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
90d0: 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28   int winMemSize(
90e0: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44  void *p){.  HAND
90f0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45  LE hHeap;.  SIZE
9100: 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  _T n;..  winMemA
9110: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9120: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9130: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
9140: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
9150: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9160: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9170: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
9180: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9190: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
91a0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
91b0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28  DATE).  assert (
91c0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
91d0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
91e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
91f0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
9200: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
9210: 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61  n 0;.  n = osHea
9220: 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c  pSize(hHeap, SQL
9230: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9240: 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20  LAGS, p);.  if( 
9250: 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b  n==(SIZE_T)-1 ){
9260: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
9270: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
9280: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69  failed to HeapSi
9290: 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ze block %p (%d)
92a0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f              p, o
92c0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
92d0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
92e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
92f0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
9300: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e  n;.}../*.** Roun
9310: 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73  d up a request s
9320: 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ize to the next 
9330: 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  valid allocation
9340: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
9350: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
9360: 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74  up(int n){.  ret
9370: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
9380: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
9390: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
93a0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
93b0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
93c0: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
93d0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
93e0: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
93f0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
9400: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
9410: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
9420: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
9430: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57  emData->magic==W
9440: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a  INMEM_MAGIC );..
9450: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
9460: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
9470: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
9480: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
9490: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
94a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
94b0: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
94c0: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
94d0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
9510: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9550: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
9560: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
9570: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
9580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9590: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
95a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
95b0: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
95c0: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
95d0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
95e0: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
95f0: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
9600: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
9610: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9620: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
9630: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
9640: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
9650: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
9660: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
9670: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9680: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
9690: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
96a0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
96b0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
96c0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
96d0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
96e0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
96f0: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
9700: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
9710: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
9720: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9730: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
9740: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
9750: 72 6f 63 65 73 73 48 65 61 70 20 28 25 64 29 22  rocessHeap (%d)"
9760: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
9770: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
9780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9790: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
97a0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
97b0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
97c0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
97d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
97e0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
97f0: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
9800: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9810: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
9820: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
9830: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
9840: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
9850: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9860: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
9870: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
9880: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
9890: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
98a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
98b0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
98c0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
98d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
98e0: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
98f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
9900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9910: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
9920: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
9930: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
9940: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
9950: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
9960: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
9970: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
9980: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
9990: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
99a0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
99b0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
99c0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
99d0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
99e0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
99f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9a00: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
9a10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
9a20: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
9a30: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
9a40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9a50: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
9a60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
9a70: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9a80: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
9a90: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
9aa0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
9ab0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
9ac0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9ad0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
9ae0: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
9af0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
9b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b10: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
9b20: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
9b30: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b50: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9b60: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
9b70: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
9b80: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
9b90: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
9ba0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
9bb0: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
9bc0: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
9bd0: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
9be0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
9bf0: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
9c00: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
9c10: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
9c20: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
9c30: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
9c40: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
9c50: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
9c60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9c70: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
9c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
9c90: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
9ca0: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
9cb0: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
9cc0: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
9cd0: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
9ce0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
9cf0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
9d00: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
9d10: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
9d20: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
9d30: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
9d40: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
9d50: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
9d60: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
9d70: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
9d80: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
9d90: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
9da0: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
9db0: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
9dc0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
9dd0: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
9de0: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
9df0: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
9e00: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
9e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
9e20: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
9e30: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
9e40: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
9e50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
9e60: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
9e70: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
9e80: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
9e90: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
9ea0: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
9eb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
9ec0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
9ed0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
9ee0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
9ef0: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
9f00: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  utf8ToUnicode(co
9f10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9f20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ame){.  int nCha
9f30: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
9f40: 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43  eFilename;..  nC
9f50: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
9f60: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
9f70: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
9f80: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
9f90: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
9fa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9fb0: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
9fc0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
9fd0: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
9fe0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
9ff0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
a000: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
a010: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a020: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
a030: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
a040: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
a050: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
a060: 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
a070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
a0a0: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
a0b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
a0c0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
a0d0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
a0e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a0f0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
a100: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
a110: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
a120: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
a130: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a140: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
a150: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
a160: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
a170: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
a180: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55  char *unicodeToU
a190: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
a1a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
a1b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
a1c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
a1d0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
a1e0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
a1f0: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
a200: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
a210: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
a220: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a230: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a240: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
a250: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
a260: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
a270: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
a280: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a290: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
a2a0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
a2b0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
a2c0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a2d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65  zFilename, nByte
a2e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e    0, 0);.  if( n
a310: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a320: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
a330: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
a340: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
a350: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
a360: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
a370: 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74  nvert an ANSI st
a380: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
a390: 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t Unicode, based
a3a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
a3b0: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
a3c0: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
a3d0: 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65  is..** .** Space
a3e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
a3f0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
a400: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
a410: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
a430: 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  R mbcsToUnicode(
a440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
a450: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
a460: 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d  yte;.  LPWSTR zM
a470: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  bcsFilename;.  i
a480: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
a490: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
a4a0: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
a4b0: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
a4c0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
a4d0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
a4e0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
a4f0: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -1, NULL,.      
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a            0)*siz
a520: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
a530: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
a540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a550: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
a560: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
a570: 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
a580: 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b  f(zMbcsFilename[
a590: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62  0]) );.  if( zMb
a5a0: 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  csFilename==0 ){
a5b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a5c0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d   }.  nByte = osM
a5d0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
a5e0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
a5f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
a600: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  MbcsFilename,.  
a610: 20 20 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 6e 42                nB
a630: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
a640: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
a650: 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69  te3_free(zMbcsFi
a660: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62  lename);.    zMb
a670: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  csFilename = 0;.
a680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62    }.  return zMb
a690: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  csFilename;.}../
a6a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
a6b0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
a6c0: 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61  o multi-byte cha
a6d0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62  racter string, b
a6e0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75  ased on the.** u
a6f0: 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70  ser's ANSI codep
a700: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
a710: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
a720: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
a730: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
a740: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a750: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
a760: 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73  r *unicodeToMbcs
a770: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
a780: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
a790: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
a7a0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
a7b0: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
a7c0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
a7d0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
a7e0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
a7f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
a800: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
a810: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
a820: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
a830: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a840: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a850: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
a860: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a870: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
a880: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
a890: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a8a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
a8b0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a8c0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
a8d0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
a8e0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
a8f0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
a920: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
a930: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
a940: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
a950: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
a960: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a970: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
a980: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
a990: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
a9a0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
a9b0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
a9c0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
a9d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
a9e0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
a9f0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
aa00: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
aa10: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
aa20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
aa30: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
aa40: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
aa50: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
aa60: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
aa70: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
aa80: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
aa90: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aab0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
aac0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
aad0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
aae0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
aaf0: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
ab00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
ab10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
ab20: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
ab30: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
ab40: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
ab50: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
ab60: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
ab70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
ab80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
ab90: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
aba0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
abb0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
abc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
abd0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
abe0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
abf0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
ac00: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
ac10: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
ac20: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
ac30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ac40: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
ac50: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
ac60: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
ac70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
ac80: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
ac90: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
aca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
acb0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
acc0: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
acd0: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
ace0: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
acf0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
ad00: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
ad10: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
ad20: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
ad30: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
ad40: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
ad50: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
ad60: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
ad70: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
ad80: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
ad90: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ada0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
adb0: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
adc0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
add0: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
ade0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
adf0: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
ae00: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
ae10: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
ae20: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
ae30: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
ae40: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
ae50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ae60: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
ae70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
ae80: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
ae90: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
aea0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
aeb0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
aec0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
aed0: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
aee0: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
aef0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
af00: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
af10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
af20: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
af30: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
af40: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
af50: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
af60: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
af70: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
af80: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
af90: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
afa0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
afb0: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
afc0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
afd0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
afe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
aff0: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
b000: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
b010: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
b020: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
b030: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
b040: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
b050: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
b060: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
b070: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
b080: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
b090: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
b0a0: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
b0b0: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
b0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
b0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b0e0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
b0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b100: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
b110: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
b120: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
b130: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b140: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
b150: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
b170: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
b180: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
b190: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
b1a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
b1b0: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
b1c0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
b1d0: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
b1e0: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
b1f0: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
b200: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
b210: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
b220: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
b230: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
b240: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
b250: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
b260: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
b270: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
b280: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
b290: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
b2a0: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
b2b0: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
b2c0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
b2d0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
b2e0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
b2f0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
b300: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
b310: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
b320: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
b330: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
b340: 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Wide[MAX_PATH+1]
b350: 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65 77  ; /* NOTE: Somew
b360: 68 61 74 20 61 72 62 69 74 72 61 72 79 2e 20 2a  hat arbitrary. *
b370: 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  /.    dwLen = os
b380: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
b390: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
b3a0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b3d0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
b3e0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
b430: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54 48          MAX_PATH
b4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b4c0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
b4d0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
b4e0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
b4f0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
b500: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
b510: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
b520: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b550: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b580: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b590: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
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 20 20 20 6c 61 73 74 45 72            lastEr
b5e0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
b630: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
b680: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
b690: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
b6a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
b6b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
b6c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
b6d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
b6e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
b6f0: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
b700: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
b710: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
b720: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
b730: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
b740: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
b750: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
b760: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
b770: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
b780: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
b790: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
b7a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
b7b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
b7c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
b7d0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
b7e0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
b7f0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b800: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
b810: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
b820: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b850: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
b860: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b890: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
b8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
b8c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
b930: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
b980: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
b990: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
b9a0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
b9b0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
b9c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
b9d0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
b9e0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
b9f0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
ba00: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
ba10: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
ba20: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
ba30: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
ba40: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
ba50: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
ba60: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
ba70: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
ba80: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
ba90: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
baa0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
bab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bac0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
bad0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20  , "OsError 0x%x 
bae0: 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  (%u)", lastErrno
baf0: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
bb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
bb10: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
bb20: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
bb30: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
bb40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
bb50: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
bb60: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
bb70: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
bb80: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
bb90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
bba0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
bbb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
bbc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
bbd0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
bbe0: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
bbf0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
bc00: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
bc10: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
bc20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
bc30: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
bc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
bc50: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
bc60: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
bc70: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
bc80: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
bc90: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
bca0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
bcb0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
bcc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
bcd0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
bce0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
bcf0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
bd00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
bd10: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
bd20: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
bd30: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
bd40: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
bd50: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
bd60: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
bd70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
bd80: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
bd90: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
bda0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
bdb0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
bdc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
bdd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
bde0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
bdf0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
be00: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
be10: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
be20: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
be30: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
be40: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
be50: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
be60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
be70: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
be80: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bea0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
beb0: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
bec0: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
bed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
bee0: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
bef0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
bf00: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
bf10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
bf20: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
bf30: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
bf40: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
bf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
bf60: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
bf70: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
bf80: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
bfb0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
bfc0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
bfd0: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
bfe0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
bff0: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
c000: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
c010: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c040: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
c050: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c  g[0] = 0;.  getL
c060: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
c070: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
c080: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
c090: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
c0a0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
c0b0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
c0c0: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
c0d0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
c0e0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
c0f0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
c100: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
c110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
c120: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
c130: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
c140: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
c150: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
c160: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
c170: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
c180: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
c190: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
c1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
c1b0: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
c1c0: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
c1d0: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
c1e0: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
c1f0: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
c200: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
c210: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
c220: 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69  ed by .** antivi
c230: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
c240: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
c250: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
c260: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
c270: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
c280: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
c290: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
c2a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c2b0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
c2c0: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
c2d0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c2e0: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
c2f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
c300: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
c310: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
c320: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c330: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
c340: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
c350: 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74  nt win32IoerrRet
c360: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
c370: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
c380: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
c390: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
c3a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c3b0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
c3c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
c3d0: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
c3e0: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
c3f0: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
c400: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
c410: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
c420: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
c430: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
c440: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
c450: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
c460: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
c470: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 72  .static int retr
c480: 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65  yIoerr(int *pnRe
c490: 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72  try, DWORD *pErr
c4a0: 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  or){.  DWORD e =
c4b0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c4c0: 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72  );.  if( *pnRetr
c4d0: 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65 74  y>=win32IoerrRet
c4e0: 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
c4f0: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
c500: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
c510: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c520: 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f   }.  if( e==ERRO
c530: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20  R_ACCESS_DENIED 
c540: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
c550: 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
c560: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
c570: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  OR_SHARING_VIOLA
c580: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TION ){.    sqli
c590: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
c5a0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
c5b0: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
c5c0: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
c5d0: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
c5e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
c5f0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
c600: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
c610: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c620: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
c630: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
c640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
c650: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
c660: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
c670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c680: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
c690: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
c6a0: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
c6b0: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
c6c0: 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f  ",.      win32Io
c6d0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
c6e0: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
c6f0: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
c700: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c710: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
c720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c760: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
c770: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
c780: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
c790: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c7a0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
c7b0: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
c7c0: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
c7d0: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
c7e0: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
c7f0: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
c800: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
c810: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
c820: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
c830: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
c840: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
c850: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
c860: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
c870: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
c880: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
c890: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
c8a0: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
c8b0: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
c8c0: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
c8d0: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
c8e0: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
c8f0: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
c900: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
c910: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
c920: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
c930: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
c940: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
c950: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
c960: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
c970: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
c980: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
c990: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
c9a0: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
c9b0: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
c9c0: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
c9d0: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
c9e0: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
c9f0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
ca00: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
ca10: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
ca20: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
ca30: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
ca40: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
ca50: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
ca60: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
ca70: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
ca80: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
ca90: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
caa0: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
cab0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
cac0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
cad0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
cae0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
caf0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
cb00: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
cb10: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
cb20: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
cb30: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
cb40: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
cb50: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
cb60: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
cb70: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
cb80: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
cb90: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
cba0: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
cbb0: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
cbc0: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
cbd0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
cbe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
cbf0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
cc00: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
cc10: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
cc20: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
cc30: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
cc40: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
cc50: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
cc60: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
cc70: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
cc80: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
cc90: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
cca0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
ccb0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
ccc0: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
ccd0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
cce0: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
ccf0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
cd00: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
cd10: 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54  .  zName = utf8T
cd20: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cd30: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
cd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
cd50: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
cd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cd70: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
cd80: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
cd90: 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
cda0: 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
cdb0: 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
cdc0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
cdd0: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
cde0: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
cdf0: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
ce00: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
ce10: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
ce20: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
ce30: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
ce40: 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
ce50: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
ce60: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
ce70: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
ce80: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
ce90: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
cea0: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
ceb0: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
cec0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
ced0: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
cee0: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
cef0: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
cf00: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
cf10: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cf20: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
cf30: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
cf40: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
cf50: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
cf60: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
cf70: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
cf80: 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
cf90: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
cfa0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
cfb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
cfc0: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
cfd0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
cfe0: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
cff0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
d000: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
d010: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
d020: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
d030: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
d040: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
d050: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
d060: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
d070: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
d080: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
d090: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
d0a0: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
d0b0: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
d0c0: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
d0d0: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
d0e0: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
d0f0: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
d100: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
d110: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
d120: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
d130: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
d140: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
d170: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
d180: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d190: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
d1c0: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
d1d0: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
d1e0: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
d1f0: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
d200: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
d210: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
d220: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
d230: 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  */.  lastErrno =
d240: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
d250: 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72  );.  if (lastErr
d260: 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  no == ERROR_ALRE
d270: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
d280: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
d290: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
d2a0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
d2b0: 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
d2c0: 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
d2d0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
d2e0: 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
d2f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d300: 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69  hared ){.    pFi
d310: 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
d320: 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
d330: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
d340: 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20  hShared, .      
d350: 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
d360: 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
d370: 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
d380: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
d390: 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
d3a0: 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
d3b0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
d3c0: 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
d3d0: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  e it */.    if( 
d3e0: 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29  !pFile->shared )
d3f0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
d400: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
d410: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
d420: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d430: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
d440: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
d470: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
d480: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
d490: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43   TRUE;.      osC
d4a0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
d4b0: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
d4c0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
d4d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
d4e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
d4f0: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
d500: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
d510: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
d520: 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
d530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d540: 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  hared==NULL ){. 
d550: 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20     if( !bLogged 
d560: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d570: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
d580: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e  Errno;.      win
d590: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
d5a0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
d5b0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d5c0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
d5d0: 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a  eCreateLock3", z
d5e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d5f0: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
d600: 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65  .    }.    wince
d610: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
d620: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
d630: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
d640: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d650: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
d660: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
d670: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d680: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
d690: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
d6a0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
d6b0: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
d6c0: 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29  */.  if( bInit )
d6d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
d6e0: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
d6f0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
d700: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
d710: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
d720: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
d730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d740: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
d750: 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
d760: 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
d770: 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
d780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d790: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
d7a0: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
d7b0: 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
d7c0: 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
d7d0: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
d7e0: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
d7f0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
d800: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
d810: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d820: 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
d830: 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
d840: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
d850: 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
d860: 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
d870: 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
d880: 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
d890: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
d8a0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
d8b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
d8c0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
d8e0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
d8f0: 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
d900: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
d910: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
d920: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
d930: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
d940: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
d950: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
d960: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
d970: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
d980: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
d990: 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
d9a0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
d9b0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
d9c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
d9d0: 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
d9e0: 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
d9f0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
da00: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f   handle */.    o
da10: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
da20: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b  (pFile->shared);
da30: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
da40: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
da50: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65  d);..    /* Done
da60: 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20   with the mutex 
da70: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
da80: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
da90: 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20  hMutex);    .   
daa0: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
dab0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
dac0: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
dad0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
dae0: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
daf0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
db00: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
db10: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
db20: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
db30: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
db40: 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
db50: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
db60: 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
db70: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
db80: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
db90: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
dba0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
dbb0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
dbc0: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
dbd0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
dbe0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
dbf0: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
dc00: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
dc10: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
dc20: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
dc30: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
dc40: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
dc50: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
dc60: 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
dc70: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
dc80: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
dc90: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
dca0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
dcb0: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
dcc0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
dcd0: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
dce0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
dcf0: 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
dd00: 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
dd10: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
dd20: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
dd30: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
dd40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
dd50: 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
dd60: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
dd70: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
dd80: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
dd90: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
dda0: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
ddb0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
ddc0: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
ddd0: 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
dde0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ddf0: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
de00: 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
de10: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
de20: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
de30: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
de40: 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
de50: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
de60: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
de70: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
de80: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
de90: 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
dea0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
deb0: 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
dec0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
ded0: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
dee0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
def0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
df00: 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
df10: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
df20: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
df30: 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
df40: 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
df50: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
df60: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
df70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
df80: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
df90: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
dfa0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
dfb0: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
dfc0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
dfd0: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
dfe0: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
dff0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
e000: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
e010: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
e020: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e030: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
e040: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
e050: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
e060: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e080: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
e090: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
e0a0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e0b0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e0c0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
e0d0: 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
e0e0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e0f0: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
e100: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
e110: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
e120: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
e130: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
e140: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
e150: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
e160: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
e170: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e180: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e190: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
e1a0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
e1b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
e1c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
e1d0: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
e1e0: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
e1f0: 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
e200: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
e210: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
e220: 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
e230: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
e240: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
e250: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
e260: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
e270: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
e280: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
e290: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
e2a0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e2b0: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
e2c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
e2d0: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
e2e0: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
e2f0: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
e300: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e310: 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
e320: 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
e330: 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
e340: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
e350: 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
e360: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
e370: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
e380: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
e390: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
e3a0: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
e3b0: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
e3c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e3d0: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
e3e0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e3f0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
e400: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
e410: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
e420: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
e430: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e440: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
e450: 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
e460: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e470: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
e480: 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
e490: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e4a0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
e4b0: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e4c0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
e4d0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
e4e0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e4f0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
e500: 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
e510: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
e520: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
e530: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e540: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
e550: 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
e560: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e570: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e580: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
e590: 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
e5a0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e5b0: 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
e5c0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
e5d0: 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
e5e0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e5f0: 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
e600: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
e610: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e620: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
e630: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e640: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e650: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
e660: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
e670: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e680: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e690: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
e6a0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e6b0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e6c0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e6d0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
e6e0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
e6f0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
e700: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
e710: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
e720: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
e730: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
e740: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e750: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e760: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
e770: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
e780: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
e790: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e7a0: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
e7b0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e7c0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e7d0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e7e0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
e7f0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e800: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
e810: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e820: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
e830: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e840: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
e850: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
e860: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e870: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
e880: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
e890: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
e8a0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
e8b0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
e8c0: 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
e8d0: 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
e8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
e930: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
e940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
e950: 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
e960: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
e970: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
e980: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
e990: 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
e9a0: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
e9b0: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
e9c0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
e9d0: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
e9e0: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
e9f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ea00: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
ea10: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
ea20: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
ea30: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
ea40: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
ea50: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
ea60: 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
ea70: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
ea80: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
ea90: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
eaa0: 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
eac0: 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
ead0: 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
eae0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
eaf0: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
eb00: 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
eb10: 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
eb20: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
eb30: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
eb40: 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
eb50: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
eb60: 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
eb70: 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
eb80: 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66  ileEx(*phFile, f
eb90: 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65  lags, 0, numByte
eba0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
ebb0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
ebc0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ebd0: 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  osLockFile(*phFi
ebe0: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
ebf0: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
ec00: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
ec20: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
ec30: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ec40: 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72   Unlock a file r
ec50: 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69  egion.. */.stati
ec60: 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b  c BOOL winUnlock
ec70: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
ec80: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
ec90: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
eca0: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
ecb0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
ecc0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
ecd0: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
ece0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
ecf0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
ed00: 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
ed10: 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
ed20: 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
ed30: 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
ed40: 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
ed50: 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a   UnlockFile..  *
ed60: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
ed70: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  UnlockFile(phFil
ed80: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
ed90: 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20     numBytesLow, 
edc0: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23  numBytesHigh);.#
edd0: 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28  else.  if( isNT(
ede0: 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
edf0: 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
ee00: 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
ee10: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
ee20: 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
ee30: 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
ee40: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
ee50: 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
ee60: 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
ee70: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
ee80: 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
ee90: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
eea0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
eeb0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
eec0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
eed0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
eee0: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
eef0: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
ef20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ef80: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
ef90: 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
efa0: 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
efb0: 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
efc0: 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
efd0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
efe0: 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f030: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
f040: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
f050: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
f060: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
f070: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
f080: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
f090: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
f0a0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f0b0: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
f0c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
f0d0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
f0e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
f0f0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
f100: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
f110: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
f120: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
f130: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
f140: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
f150: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
f160: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
f170: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
f180: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
f190: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
f1a0: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
f1b0: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
f1c0: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
f1d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
f1e0: 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65  INRT.  LONG uppe
f1f0: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f200: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73         /* Most s
f210: 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
f220: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c  ew offset */.  L
f230: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20  ONG lowerBits;  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f250: 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20  * Least sig. 32 
f260: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
f270: 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  et */.  DWORD dw
f280: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
f290: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
f2a0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
f2b0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f  FilePointer() */
f2c0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
f2d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
f2e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
f2f0: 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
f300: 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70  rror() */..  upp
f310: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
f320: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
f330: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
f340: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
f350: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
f360: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
f370: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
f380: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
f390: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
f3a0: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
f3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f3c0: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
f3d0: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
f3e0: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
f3f0: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
f400: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
f410: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
f420: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
f430: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
f440: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
f450: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
f460: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
f470: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
f480: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
f490: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
f4a0: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
f4b0: 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c  ccured, it is al
f4c0: 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
f4d0: 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
f4e0: 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
f4f0: 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
f500: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
f510: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
f520: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
f530: 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
f540: 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
f550: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f560: 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
f570: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f580: 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
f590: 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
f5a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f5b0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
f5c0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
f5d0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
f5e0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
f600: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
f610: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
f620: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
f630: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
f640: 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61    /*.  ** Same a
f650: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
f660: 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d  that this implem
f670: 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66  entation works f
f680: 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a  or WinRT..  */..
f690: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
f6a0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f6b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66    /* The new off
f6c0: 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  set */.  BOOL bR
f6d0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f6f0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
f700: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29  tFilePointerEx()
f710: 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72   */..  x.QuadPar
f720: 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62  t = iOffset;.  b
f730: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
f740: 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e  ointerEx(pFile->
f750: 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45  h, x, 0, FILE_BE
f760: 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65  GIN);..  if(!bRe
f770: 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  t){.    pFile->l
f780: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f790: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
f7a0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f7b0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f7c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f7d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f7e0: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f7f0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f800: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f810: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
f820: 69 66 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  if.}../* Forward
f830: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
f840: 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
f850: 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
f860: 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
f870: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
f880: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
f890: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
f8a0: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
f8b0: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
f8c0: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
f8d0: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
f8e0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
f8f0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
f900: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
f910: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
f920: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
f930: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
f940: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
f950: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
f960: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
f970: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
f980: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
f990: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
f9a0: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
f9b0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
f9c0: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
f9d0: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
f9e0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
f9f0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
fa00: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
fa10: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
fa20: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
fa30: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
fa40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fa50: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
fa60: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
fa70: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fa80: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
fa90: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
faa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fab0: 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
fac0: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
fad0: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
fae0: 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
faf0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 61 73  pFile->h));.  as
fb00: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
fb10: 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
fb20: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
fb30: 5f 56 41 4c 55 45 20 29 3b 0a 0a 20 20 72 63 20  _VALUE );..  rc 
fb40: 3d 20 77 69 6e 55 6e 6d 61 70 28 69 64 29 3b 0a  = winUnmap(id);.
fb50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fb60: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
fb70: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
fb80: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
fb90: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
fba0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fbb0: 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
fbc0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
fbd0: 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
fbe0: 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
fbf0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
fc00: 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
fc10: 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
fc20: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
fc30: 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
fc40: 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
fc50: 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
fc60: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
fc70: 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
fc80: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
fc90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
fca0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
fcb0: 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
fcc0: 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
fcd0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
fce0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
fcf0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
fd00: 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
fd10: 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
fd20: 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26  fffff .        &
fd30: 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
fd40: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
fd50: 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
fd60: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
fd70: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
fd80: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
fd90: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
fda0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
fdb0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
fdc0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
fdd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
fde0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
fdf0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
fe00: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
fe10: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28  failed"));.  if(
fe20: 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
fe30: 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
fe40: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
fe50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
fe60: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
fe70: 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
fe80: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fe90: 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
fea0: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
fed0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
fee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
fef0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
ff00: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
ff10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ff20: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
ff30: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
ff40: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
ff50: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
ff60: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
ff70: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
ff80: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
ff90: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
ffa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
ffb0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
ffc0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
ffe0: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
fff0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
10000 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10020 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10030 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
10040 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
10050 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
10060 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
10070 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
10080 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10090 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
100a0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
100b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
100c0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
100d0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
100e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
100f0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
10100 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
10110 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10140 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
10150 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
10160 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
10170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
10190 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
101a0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
101b0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
101c0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
101d0 3e 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  >=pFile->mmapSiz
101e0 65 20 29 3b 20 2f 2a 20 4e 65 76 65 72 20 72 65  e ); /* Never re
101f0 61 64 20 66 72 6f 6d 20 74 68 65 20 6d 6d 61 70  ad from the mmap
10200 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
10210 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10230 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
10240 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
10250 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
10260 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
10270 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
10280 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
10290 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
102a0 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
102b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102c0 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
102d0 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
102e0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
102f0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
10300 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
10310 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
10320 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
10330 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
10340 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
10350 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
10360 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
10370 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
10380 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
10390 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
103a0 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
103b0 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
103c0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
103d0 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
103e0 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
103f0 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
10400 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
10410 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
10420 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
10430 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65  rrno;.    if( re
10440 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
10450 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
10460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
10470 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10480 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10490 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
104a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
104b0 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
104c0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
104d0 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
104e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
104f0 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52   }.  logIoerr(nR
10500 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65  etry);.  if( nRe
10510 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
10520 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
10530 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
10540 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
10550 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
10560 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
10570 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
10580 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
10590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
105a0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
105b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
105c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
105d0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
105e0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
105f0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
10600 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10610 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
10620 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
10630 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
10640 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
10650 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
10660 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
10670 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
10680 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
10690 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
106a0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
106b0 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
106c0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
106d0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10700 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
10710 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10720 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
10730 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
10740 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
10750 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
10760 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
10770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10790 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
107a0 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
107b0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
107c0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
107d0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
107e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
107f0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
10800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10810 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
10820 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
10830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
10840 66 73 65 74 3e 3d 70 46 69 6c 65 2d 3e 6d 6d 61  fset>=pFile->mma
10850 70 53 69 7a 65 20 29 3b 20 2f 2a 20 4e 65 76 65  pSize ); /* Neve
10860 72 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  r write into the
10870 20 6d 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20   mmapped region 
10880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
10890 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
108a0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
108b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
108c0 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
108d0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
108e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
108f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
10900 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
10910 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
10920 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
10930 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
10940 49 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b  INCE.  rc = seek
10950 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
10960 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
10970 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
10980 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
10990 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
109a0 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
109b0 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
109c0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
109d0 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
109e0 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
109f0 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
10a00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
10a10 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
10a20 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
10a30 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
10a40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10a50 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
10a60 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
10a70 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
10aa0 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
10ab0 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
10ac0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
10ad0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
10ae0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
10af0 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
10b00 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
10b10 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
10b20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
10b30 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
10b40 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
10b50 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
10b60 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
10b70 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
10b80 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
10b90 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
10ba0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
10bb0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
10bc0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
10bd0 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
10be0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10bf0 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  E.      if( !osW
10c00 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
10c10 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
10c20 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
10c30 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
10c40 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
10c50 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
10c60 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
10c70 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
10c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
10c90 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
10ca0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
10cb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
10cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
10ce0 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
10cf0 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
10d00 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
10d10 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
10d20 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
10d30 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
10d40 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10d50 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
10d60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
10d70 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
10d80 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
10d90 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
10da0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
10db0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
10dc0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
10dd0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
10de0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
10df0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
10e00 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
10e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
10e20 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
10e30 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
10e40 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
10e50 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
10e60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10e70 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
10e80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
10e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
10ea0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
10eb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10ec0 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
10ed0 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
10ee0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
10ef0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
10f00 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
10f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f20 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
10f30 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
10f40 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10f50 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e  R_WRITE, pFile->
10f60 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
10f70 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
10f80 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
10f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10fa0 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
10fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10fd0 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
10fe0 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
10ff0 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
11000 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
11010 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
11020 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
11030 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
11040 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
11050 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
11060 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
11070 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
11080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
11090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
110a0 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74  eturn code for t
110b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
110c0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
110d0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  o;..  assert( pF
110e0 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
110f0 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
11100 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
11110 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
11120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
11130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11140 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
11150 72 63 20 3d 20 77 69 6e 55 6e 6d 61 70 28 69 64  rc = winUnmap(id
11160 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11170 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
11180 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
11190 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
111a0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
111b0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
111c0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
111d0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
111e0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
111f0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
11200 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
11210 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
11220 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
11230 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
11240 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
11250 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
11260 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
11270 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
11280 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
11290 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
112a0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
112b0 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
112c0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
112d0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
112e0 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
112f0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
11300 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
11310 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
11320 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
11330 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
11340 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
11350 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
11360 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
11370 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
11380 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
113b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
113c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
113d0 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
113e0 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20  File->h) &&.    
113f0 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72          ((lastEr
11400 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11410 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55  rror())!=ERROR_U
11420 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29  SER_MAPPED_FILE)
11430 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
11440 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
11450 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77  rrno;.    rc = w
11460 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11470 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
11480 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11490 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
114a0 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
114b0 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
114c0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
114d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
114e0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
114f0 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
11500 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
11510 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
11520 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
11530 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
11540 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
11550 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
11560 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
11570 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
11580 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
11590 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
115a0 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
115b0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
115c0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
115d0 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70  egion && nByte<p
115e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
115f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d  {.      pFile->m
11600 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  mapSize = nByte;
11610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53  .    }.  }..  OS
11620 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
11630 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20   %d %lld %s\n", 
11640 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
11650 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a   rc ? "failed" :
11660 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72   "ok"));.  retur
11670 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
11680 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
11690 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
116a0 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
116b0 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
116c0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
116d0 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
116e0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
116f0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
11700 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
11710 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
11720 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
11730 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
11740 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
11750 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
11760 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
11770 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
11780 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
11790 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
117a0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
117b0 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33   winSync(sqlite3
117c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
117d0 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53  lags){.#ifndef S
117e0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
117f0 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c  /*.  ** Used onl
11800 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  y when SQLITE_NO
11810 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
11820 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f  ined..   */.  BO
11830 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  OL rc;.#endif.#i
11840 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
11850 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  G) || !defined(S
11860 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c  QLITE_NO_SYNC) |
11870 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64  | \.    (defined
11880 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
11890 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
118a0 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a  DEBUG)).  /*.  *
118b0 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49  * Used when SQLI
118c0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
118d0 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79  t defined and by
118e0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e   the assert() an
118f0 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43  d/or.  ** OSTRAC
11900 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a  E() macros..   *
11910 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
11920 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
11930 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  d;.#else.  UNUSE
11940 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
11950 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
11960 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a  t( pFile );.  /*
11970 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
11980 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
11990 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
119a0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
119b0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
119c0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
119d0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
119e0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
119f0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
11a00 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
11a10 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  SYNC %d lock=%d\
11a20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
11a30 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
11a40 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
11a50 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
11a60 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
11a70 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
11a80 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
11a90 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
11aa0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
11ab0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
11ac0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
11ad0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
11ae0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
11af0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
11b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11b10 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
11b20 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
11b30 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
11b40 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
11b50 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
11b60 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
11b70 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
11b80 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
11b90 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
11ba0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
11bb0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
11bc0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
11bd0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
11be0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
11bf0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
11c00 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75  E_NO_SYNC.  retu
11c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
11c20 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  lse.  rc = osFlu
11c30 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
11c40 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
11c50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
11c60 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
11c70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
11c90 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
11ca0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11cb0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11cc0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
11cd0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11ce0 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSYNC, pFile->la
11cf0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11d00 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c        "winSync",
11d10 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11d20 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
11d30 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
11d40 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
11d50 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
11d60 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
11d70 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
11d80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
11d90 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
11da0 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
11db0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
11dc0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
11dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
11de0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
11df0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11e00 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
11e10 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69  IOERR_FSTAT);.#i
11e20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
11e30 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
11e40 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
11e50 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
11e60 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
11e70 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
11e80 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
11e90 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
11ec0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
11ed0 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
11ee0 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
11ef0 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
11f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11f10 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
11f20 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11f30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
11f40 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11f50 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
11f60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
11f90 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
11fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
11fb0 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
11fc0 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
11fd0 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
11fe0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
11ff0 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
12000 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
12010 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
12020 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
12030 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
12040 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
12050 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
12060 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
12070 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
12080 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
12090 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
120a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
120b0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
120c0 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
120d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
120e0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
120f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
12100 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12110 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
12120 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
12130 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65          "winFile
12140 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Size", pFile->zP
12150 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
12160 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12170 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
12180 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
12190 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
121a0 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
121b0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
121c0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
121d0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
121e0 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
121f0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
12200 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
12210 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
12220 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
12230 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
12240 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
12250 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
12260 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
12270 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
12280 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
12290 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
122a0 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
122b0 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
122c0 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
122d0 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
122e0 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
122f0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
12300 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
12310 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
12320 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
12330 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
12340 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
12350 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
12360 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
12370 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
12380 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
12390 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
123a0 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
123b0 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
123c0 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
123d0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
123e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
123f0 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
12400 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
12410 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
12420 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
12430 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
12460 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
12470 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
12480 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
12490 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
124a0 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
124b0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
124c0 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
124d0 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
124e0 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
124f0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
12500 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
12510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
12520 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
12530 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
12540 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
12550 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
12560 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
12570 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
12580 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
12590 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
125a0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
125b0 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
125c0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
125d0 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
125e0 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
125f0 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
12600 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
12610 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
12620 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
12630 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12640 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20  INCE.    /*.    
12650 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
12660 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
12670 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
12680 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
12690 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a  the Win32.    **
126a0 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
126b0 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  ileEx..    */.  
126c0 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63    res = winceLoc
126d0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
126e0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
126f0 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  , 1, 0);.#else. 
12700 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
12710 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12720 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
12730 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
12740 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
12770 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
12780 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
12790 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
127a0 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
127b0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
127c0 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
127d0 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
127e0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
127f0 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
12800 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
12810 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
12820 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
12830 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12840 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12850 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
12870 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
12880 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
12890 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
128a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
128b0 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   == 0 ){.    pFi
128c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
128d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
128e0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
128f0 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
12900 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
12910 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12920 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72  ../*.** Undo a r
12930 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  eadlock.*/.stati
12940 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64  c int unlockRead
12950 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
12960 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
12970 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
12980 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  no;.  if( isNT()
12990 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
129a0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
129b0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
129c0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
129d0 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
129e0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
129f0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
12a00 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
12a10 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
12a20 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
12a30 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
12a40 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
12a50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12a60 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
12a70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12a80 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
12a90 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
12aa0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12ab0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12ac0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12ad0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12ae0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
12af0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12b00 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63            "unloc
12b10 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
12b20 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
12b30 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
12b40 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12b50 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12b60 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
12b70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
12b80 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
12b90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
12ba0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
12bb0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
12bc0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
12bd0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
12be0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
12bf0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
12c00 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
12c10 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
12c20 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
12c30 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
12c40 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
12c50 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
12c60 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
12c70 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
12c80 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
12c90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12ca0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
12cb0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
12cc0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
12cd0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
12ce0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
12cf0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
12d00 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
12d10 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
12d20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
12d30 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
12d40 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
12d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
12d60 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
12d70 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
12d80 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
12d90 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
12da0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12db0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
12dc0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12dd0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
12de0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
12df0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
12e00 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
12e10 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
12e20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
12e30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
12e40 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
12e50 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
12e60 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
12e70 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
12e80 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
12e90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
12ea0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
12eb0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
12ec0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
12ed0 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
12ee0 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
12ef0 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
12f00 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
12f10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12f20 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
12f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12f40 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
12f50 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
12f60 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
12f70 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
12f80 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
12f90 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
12fa0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
12fb0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
12fc0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
12fd0 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
12fe0 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
12ff0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
13000 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
13010 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
13020 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
13030 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
13040 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
13050 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
13060 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
13070 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
13080 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
13090 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
130a0 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20  "LOCK %d %d was 
130b0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d(%d)\n",.     
130c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
130d0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
130e0 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
130f0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
13100 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
13110 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13120 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
13130 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
13140 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
13150 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
13160 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
13170 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
13180 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
13190 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
131a0 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
131b0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
131c0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
131d0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
131e0 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
131f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13200 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
13220 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
13230 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13240 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
13250 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
13260 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
13270 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
13280 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
13290 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
132a0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
132b0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
132c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
132d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
132e0 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
132f0 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
13300 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
13310 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
13320 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
13330 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
13340 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
13350 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
13360 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
13370 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
13380 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
13390 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
133a0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
133b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
133c0 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
133d0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
133e0 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
133f0 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
13400 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
13410 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
13420 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
13430 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
13440 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
13450 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
13460 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
13470 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13480 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
13490 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
134d0 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
134e0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
134f0 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
13500 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
13510 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
13520 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
13530 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
13540 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
13550 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
13560 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
13570 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
13580 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
13590 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
135a0 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
135b0 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
135c0 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
135d0 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
135e0 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
135f0 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
13600 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
13610 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
13620 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13630 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20  OSTRACE(("could 
13640 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e  not get a PENDIN
13650 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e  G lock. cnt=%d\n
13660 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20  ", cnt));.      
13670 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
13680 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
13690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
136a0 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
136b0 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
136c0 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
136d0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
136e0 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
136f0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
13700 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
13710 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
13720 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
13730 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
13740 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
13750 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
13760 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
13770 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
13780 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
13790 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
137a0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
137b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
137c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
137d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
137e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
137f0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
13800 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
13810 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
13820 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
13830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13840 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
13850 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
13860 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
13870 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
13880 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
13890 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59  AGS, RESERVED_BY
138a0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
138b0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
138c0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
138d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a   RESERVED_LOCK;.
138e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138f0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
13900 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
13910 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13920 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
13930 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
13940 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
13950 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
13960 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74   ){.    newLockt
13970 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
13980 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69  CK;.    gotPendi
13990 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  ngLock = 0;.  }.
139a0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e  .  /* Acquire an
139b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a   EXCLUSIVE lock.
139c0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
139d0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
139e0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
139f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13a00 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45  >locktype>=SHARE
13a10 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
13a20 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
13a30 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f  ck(pFile);.    O
13a40 53 54 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c  STRACE(("unreadl
13a50 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
13a60 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
13a70 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
13a80 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
13a90 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
13aa0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
13ad0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
13ae0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
13af0 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
13b00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
13b10 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
13b20 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13b30 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
13b40 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65  ACE(("error-code
13b50 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72   = %d\n", lastEr
13b60 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74  rno));.      get
13b70 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
13b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13b90 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
13ba0 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
13bb0 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
13bc0 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
13bd0 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
13be0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
13bf0 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
13c00 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
13c10 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13c20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
13c30 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
13c40 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
13c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
13c60 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  te the state of 
13c70 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c  the lock has hel
13c80 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  d in the file de
13c90 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20  scriptor then.  
13ca0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70  ** return the ap
13cb0 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74  propriate result
13cc0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   code..  */.  if
13cd0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20  ( res ){.    rc 
13ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
13cf0 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43  else{.    OSTRAC
13d00 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20  E(("LOCK FAILED 
13d10 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64  %d trying for %d
13d20 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20   but got %d\n", 
13d30 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
13d40 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e       locktype, n
13d50 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
13d60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13d70 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
13d80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13d90 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
13da0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
13db0 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
13dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13dd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13de0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13df0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13e00 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13e10 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13e20 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13e30 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13e40 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13e50 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
13e60 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
13e70 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
13e80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
13e90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
13ea0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13eb0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
13ec0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
13ed0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13ee0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
13ef0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
13f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13f10 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
13f20 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
13f30 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
13f40 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
13f50 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
13f60 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
13f70 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13f80 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
13f90 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
13fa0 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
13fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
13fc0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
13fd0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
13fe0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
13ff0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
14000 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
14010 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  rc ){.      winU
14020 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
14030 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
14040 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
14050 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
14060 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
14070 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
14080 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
14090 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
140a0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
140b0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
140c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
140d0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
140e0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
140f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
14100 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
14110 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
14120 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
14130 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
14140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
14150 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
14160 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
14170 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
14180 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
14190 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
141a0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
141b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
141c0 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
141d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
141e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
141f0 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
14200 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
14210 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
14220 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14230 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
14240 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
14250 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
14260 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14270 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
14280 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
14290 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
142a0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
142b0 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
142c0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
142d0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
142e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
142f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
14300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
14310 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
14320 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
14330 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
14340 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
14350 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
14360 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
14370 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
14380 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
14390 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
143a0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
143b0 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
143c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
143d0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
143e0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
143f0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
14400 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
14410 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
14420 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
14430 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
14440 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
14450 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
14460 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
14470 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
14480 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
14490 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
144a0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
144b0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
144c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
144d0 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
144e0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
144f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
14500 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lock", pFile->zP
14510 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
14520 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
14530 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
14540 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
14550 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
14560 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
14570 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
14580 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
14590 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
145a0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
145b0 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
145c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
145d0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
145e0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
145f0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14600 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14610 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69  1, 0);.  }.  pFi
14620 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
14630 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  u8)locktype;.  r
14640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14650 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
14660 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
14670 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
14680 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
14690 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
146a0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
146b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
146c0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
146d0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
146e0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
146f0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
14700 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
14710 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
14720 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
14730 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14740 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
14750 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
14760 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
14770 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
14780 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
14790 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
147a0 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
147b0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
147c0 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
147d0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
147e0 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
147f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
14800 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
14810 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
14820 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
14830 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
14840 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
14850 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
14860 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  uf);../*.** Cont
14870 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
14880 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
14890 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
148a0 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
148b0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
148c0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
148d0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
148e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
148f0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
14900 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
14910 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
14920 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
14930 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
14940 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
14950 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
14960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14970 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
14980 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
14990 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
149a0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
149b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
149c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
149d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
149e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
149f0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
14a00 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
14a10 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
14a20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14a40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14a50 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
14a60 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   {.      if( pFi
14a70 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
14a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14a90 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
14aa0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
14ab0 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
14ac0 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
14ad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14ae0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
14af0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
14b00 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
14b10 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
14b20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
14b30 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
14b40 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14b50 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
14b60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
14b70 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
14b80 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
14b90 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
14ba0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
14bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
14bd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14be0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14bf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
14c00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14c10 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
14c20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
14c30 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
14c40 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
14c50 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
14c60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14c70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
14c80 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
14c90 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
14ca0 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
14cb0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
14cc0 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
14cd0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
14ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14d00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
14d10 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
14d20 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
14d30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14d40 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72  win32");.      r
14d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14d60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14d70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
14d80 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
14d90 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
14da0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
14db0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
14dc0 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
14dd0 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
14de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14df0 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
14e00 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
14e10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
14e20 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
14e30 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
14e40 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
14e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14e60 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
14e70 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
14e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14ea0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
14eb0 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
14ec0 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
14ed0 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
14ee0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
14ef0 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
14f00 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
14f10 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
14f20 0a 20 20 20 20 20 20 20 20 67 65 74 54 65 6d 70  .        getTemp
14f30 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
14f40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
14f50 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  File);.        *
14f60 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
14f70 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
14f80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14f90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
14fa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14fb0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
14fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
14fd0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
14fe0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
14ff0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
15000 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
15010 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
15020 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
15030 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
15040 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
15050 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
15060 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
15070 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
15080 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
15090 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
150a0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
150b0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
150c0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
150d0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
150e0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
150f0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
15100 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
15110 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
15120 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
15130 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
15140 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
15150 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
15160 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
15170 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
15180 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
15190 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
151a0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
151b0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
151c0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
151d0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
151e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
151f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
15200 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
15210 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
15220 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
15230 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
15240 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
15250 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
15260 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
15270 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
15280 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
15290 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
152a0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
152b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
152c0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20  TE_OMIT_WAL../* 
152d0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
152e0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
152f0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
15300 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
15310 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
15320 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
15330 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
15340 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
15350 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
15360 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
15370 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
15380 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
15390 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
153a0 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  nfo;../*.** Help
153b0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
153c0 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
153d0 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
153e0 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
153f0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
15400 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
15410 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
15420 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
15430 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
15440 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
15450 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
15460 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
15470 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
15480 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
15490 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
154a0 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
154b0 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
154c0 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
154d0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
154e0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
154f0 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
15500 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
15510 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
15520 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
15530 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
15540 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
15550 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
15560 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
15570 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
15580 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
15590 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
155a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
155b0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
155c0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
155d0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
155e0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
155f0 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
15600 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
15610 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
15620 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15630 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15640 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
15650 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
15660 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
15670 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
15680 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
15690 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
156a0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
156b0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
156c0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
156d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
156e0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
156f0 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
15700 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
15710 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
15720 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
15730 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
15740 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
15750 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
15760 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
15770 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
15780 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
15790 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
157a0 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
157b0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
157c0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
157d0 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
157e0 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
157f0 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
15800 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
15810 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
15820 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
15830 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
15840 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
15850 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
15860 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
15870 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
15880 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
15890 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
158a0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
158b0 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a       pNext .**.*
158c0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
158d0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
158e0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
158f0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
15900 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
15910 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
15920 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
15930 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
15940 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
15950 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
15960 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
15970 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
15980 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
15990 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
159a0 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
159b0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
159c0 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
159d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
159e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
159f0 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
15a00 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
15a10 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
15a20 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
15a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15a40 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
15a50 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
15a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15a70 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
15a80 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
15a90 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
15aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
15ab0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
15ac0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
15ad0 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15af0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
15b00 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
15b10 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
15b20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
15b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
15b40 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
15b50 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
15b60 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
15b70 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
15b80 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
15b90 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
15ba0 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
15bb0 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
15bc0 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
15bd0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15bf0 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
15c00 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
15c10 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
15c20 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
15c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
15c40 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
15c50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
15c60 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
15c70 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
15c80 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
15c90 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
15ca0 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
15cb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
15cc0 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
15cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15ce0 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
15cf0 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
15d00 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
15d10 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
15d20 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
15d30 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
15d40 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
15d50 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
15d60 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
15d70 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
15d80 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
15d90 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
15da0 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
15db0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
15dc0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
15dd0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
15de0 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
15df0 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
15e00 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
15e10 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
15e20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15e30 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
15e40 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
15e50 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
15e60 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
15e70 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
15e80 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
15e90 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
15ea0 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
15eb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
15ec0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
15ed0 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
15ee0 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
15ef0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
15f00 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
15f10 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
15f20 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
15f30 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
15f40 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
15f50 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
15f60 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
15f70 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
15f80 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
15f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15fa0 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
15fb0 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
15fc0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
15fd0 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
15fe0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15ff0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
16000 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
16010 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
16020 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
16030 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
16040 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
16050 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
16060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
16070 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
16080 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
16090 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
160a0 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160c0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
160d0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
160e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
160f0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
16100 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
16110 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
16120 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
16130 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
16140 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
16150 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
16160 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
16170 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
16180 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
16190 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
161a0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
161b0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
161c0 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
161d0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
161e0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
161f0 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
16200 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
16210 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
16220 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
16230 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
16240 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
16250 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
16260 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
16270 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
16280 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
16290 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
162a0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
162b0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
162c0 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
162d0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
162e0 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
162f0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
16300 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
16310 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
16320 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
16330 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
16340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16350 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
16360 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
16370 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16380 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
16390 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
163a0 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
163b0 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
163c0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
163d0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
163e0 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
163f0 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
16400 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16410 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
16420 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
16430 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
16440 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
16450 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
16460 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
16470 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
16480 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
16490 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
164a0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
164b0 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
164c0 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
164d0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
164e0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
164f0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
16500 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
16510 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
16520 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
16530 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
16540 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46  _SHM_WRLCK ) dwF
16550 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
16560 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
16570 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
16580 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
16590 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
165a0 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
165b0 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  0);.  }.  .  if(
165c0 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72   rc!= 0 ){.    r
165d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
165e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
165f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20  e->lastErrno =  
16600 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16610 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
16620 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f  E_BUSY;.  }..  O
16630 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
16640 4b 20 25 64 20 25 73 20 25 73 20 30 78 25 30 38  K %d %s %s 0x%08
16650 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  lx\n", .        
16660 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
16670 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  h,.           rc
16680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
16690 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20  k" : "failed",. 
166a0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 54 79            lockTy
166b0 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f  pe==_SHM_UNLCK ?
166c0 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20   "UnlockFileEx" 
166d0 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a  : "LockFileEx",.
166e0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
166f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a  ->lastErrno));..
16700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16710 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
16720 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74  ences to VFS met
16730 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  hods */.static i
16740 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74  nt winOpen(sqlit
16750 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68  e3_vfs*,const ch
16760 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  ar*,sqlite3_file
16770 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61  *,int,int*);.sta
16780 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
16790 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
167a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
167b0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  ;../*.** Purge t
167c0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  he winShmNodeLis
167d0 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
167e0 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68  tries with winSh
167f0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
16800 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
16810 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
16820 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
16830 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
16840 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
16850 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
16860 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
16870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
16880 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33  ShmPurge(sqlite3
16890 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
168a0 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77  deleteFlag){.  w
168b0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a  inShmNode **pp;.
168c0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b    winShmNode *p;
168d0 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61  .  BOOL bRc;.  a
168e0 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
168f0 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70 70  exHeld() );.  pp
16900 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69   = &winShmNodeLi
16910 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20  st;.  while( (p 
16920 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20  = *pp)!=0 ){.   
16930 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
16940 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
16950 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74        if( p->mut
16960 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex ) sqlite3_mut
16970 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
16980 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
16990 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
169a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 62 52  i++){.        bR
169b0 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f  c = osUnmapViewO
169c0 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  fFile(p->aRegion
169d0 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20  [i].pMap);.     
169e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
169f0 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 75 6e  -PURGE pid-%d un
16a00 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 25 73  map region=%d %s
16a10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16a20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
16a30 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16a40 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  (), i,.         
16a50 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f          bRc ? "o
16a60 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
16a70 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
16a80 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
16a90 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
16aa0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
16ab0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
16ac0 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69 6f  d-%d close regio
16ad0 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  n=%d %s\n",.    
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
16af0 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
16b00 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20  ocessId(), i,.  
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
16b20 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
16b30 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
16b40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69        if( p->hFi
16b50 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d  le.h!=NULL && p-
16b60 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49  >hFile.h!=INVALI
16b70 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
16b80 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
16b90 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
16ba0 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43  1);.        winC
16bb0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
16bc0 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b  le *)&p->hFile);
16bd0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
16be0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
16bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c00 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
16c10 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
16c20 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
16c30 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (1);.        sql
16c40 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
16c50 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
16c60 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
16c70 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
16c80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16c90 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
16ca0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  c();.        Sim
16cb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16cc0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
16cd0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e       *pp = p->pN
16ce0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
16cf0 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69  e3_free(p->aRegi
16d00 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
16d10 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
16d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20  }else{.      pp 
16d30 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = &p->pNext;.   
16d40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16d50 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d  Open the shared-
16d60 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
16d70 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
16d80 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
16d90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
16da0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
16db0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
16dc0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
16dd0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
16de0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
16df0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
16e00 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
16e10 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
16e20 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
16e30 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
16e40 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
16e50 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
16e60 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
16e70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
16e80 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  enSharedMemory(w
16e90 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  inFile *pDbFd){.
16ea0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20    struct winShm 
16eb0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
16ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
16ed0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
16ee0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
16ef0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
16f00 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54  Node = 0;   /* T
16f10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
16f20 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
16f30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
16f60 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  e */.  struct wi
16f70 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20  nShmNode *pNew; 
16f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
16f90 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e  ly allocated win
16fa0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ShmNode */.  int
16fb0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
16fe0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
16ff0 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
17000 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  Shm==0 );    /* 
17010 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  Not previously o
17020 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  pened */..  /* A
17030 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
17040 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  r the new sqlite
17050 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41  3_shm object.  A
17060 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c  lso speculativel
17070 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  y.  ** allocate 
17080 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
17090 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66  winShmNode and f
170a0 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
170b0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
170c0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
170d0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
170e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
170f0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e  IOERR_NOMEM;.  n
17100 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
17110 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
17120 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
17130 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
17140 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
17150 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
17160 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
17170 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17180 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
17190 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
171a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  R_NOMEM;.  }.  p
171b0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
171c0 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
171d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
171e0 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70  intf(nName+15, p
171f0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  New->zFilename, 
17200 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
17210 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74  >zPath);.  sqlit
17220 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
17230 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77  bFd->zPath, pNew
17240 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a  ->zFilename); ..
17250 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65    /* Look to see
17260 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
17270 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e  existing winShmN
17280 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ode that can be 
17290 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f  used..  ** If no
172a0 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d   matching winShm
172b0 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65  Node currently e
172c0 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
172d0 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
172e0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
172f0 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f  ();.  for(pShmNo
17300 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  de = winShmNodeL
17310 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70  ist; pShmNode; p
17320 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65  ShmNode=pShmNode
17330 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
17340 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d   TBD need to com
17350 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72  e up with better
17360 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65   match here.  Pe
17370 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65  rhaps.    ** use
17380 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49   FILE_ID_BOTH_DI
17390 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65  R_INFO Structure
173a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
173b0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
173c0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
173d0 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ame, pNew->zFile
173e0 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  name)==0 ) break
173f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
17400 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Node ){.    sqli
17410 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
17420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68    }else{.    pSh
17430 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20  mNode = pNew;.  
17440 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
17450 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68  ((winFile*)(&pSh
17460 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e  mNode->hFile))->
17470 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
17480 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53  LE_VALUE;.    pS
17490 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20  hmNode->pNext = 
174a0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
174b0 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69      winShmNodeLi
174c0 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a  st = pShmNode;..
174d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
174e0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
174f0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
17500 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
17510 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
17520 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
17530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
17540 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
17550 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
17560 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
17570 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
17580 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
17590 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
175a0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
175b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
175c0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
175d0 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
175e0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
175f0 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
17600 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
17610 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
17620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17630 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17640 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _WAL | SQLITE_OP
17650 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
17660 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17670 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
17680 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
17690 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
176a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
176b0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
176c0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
176d0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
176e0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
176f0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
17700 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
17710 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
17720 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
17730 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
17740 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
17750 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
17760 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
17770 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
17780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17790 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
177a0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
177b0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
177c0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
177d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
177e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
177f0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
17800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
17810 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
17820 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
17830 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
17840 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
17850 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
17860 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17880 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
17890 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
178a0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
178b0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
178c0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
178d0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
178e0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
178f0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
17900 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
17910 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
17920 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
17930 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
17940 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
17950 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
17960 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
17970 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
17980 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17990 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
179a0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
179b0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
179c0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
179d0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
179e0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
179f0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
17a00 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
17a10 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
17a20 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
17a30 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
17a40 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
17a50 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
17a60 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
17a70 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
17a80 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
17a90 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
17aa0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
17ab0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
17ac0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
17ad0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
17ae0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
17af0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
17b00 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
17b10 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
17b20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
17b30 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
17b40 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
17b50 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
17b60 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
17b70 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
17b80 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
17b90 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
17ba0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
17bb0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
17bc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
17bd0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
17be0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
17bf0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
17c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17c10 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
17c20 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
17c30 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
17c40 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
17c50 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
17c60 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
17c70 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
17c80 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
17c90 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
17ca0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
17cb0 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
17cc0 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
17cd0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
17ce0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
17cf0 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
17d00 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
17d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17d20 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
17d30 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
17d40 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
17d50 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
17d60 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
17d70 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
17d80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
17d90 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
17da0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
17db0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17dc0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
17dd0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
17de0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
17df0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
17e00 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
17e10 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
17e20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
17e30 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17e40 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
17e50 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
17e60 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
17e70 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
17e80 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
17e90 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
17ea0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
17eb0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
17ec0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
17ed0 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
17ee0 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
17ef0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
17f00 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
17f10 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
17f20 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
17f30 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
17f40 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
17f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17f60 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
17f70 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
17f80 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
17f90 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
17fa0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
17fb0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
17fc0 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
17fd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
17fe0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
17ff0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
18000 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
18010 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
18020 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
18030 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
18040 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
18050 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
18060 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
18070 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
18080 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
18090 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
180a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
180b0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
180c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
180d0 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
180e0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
180f0 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
18100 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
18110 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
18120 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
18130 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
18140 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
18150 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
18160 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
18170 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
18180 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
18190 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
181a0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
181b0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
181c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
181d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
181e0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
181f0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
18200 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
18210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18220 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
18230 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
18240 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18250 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
18260 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
18270 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
182a0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
182b0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
182c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
182d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
182e0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
182f0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
18300 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18320 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
18330 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
18340 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
18350 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
18360 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
18370 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
18380 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
18390 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
183a0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
183b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
183c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
183d0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
183e0 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18410 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
18420 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
18430 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
18440 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
18450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18460 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
18470 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
18480 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
18490 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
184c0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
184d0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
184e0 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
184f0 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
18500 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
18510 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
18520 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
18530 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
18540 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
18550 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
18560 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
18570 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
18580 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
18590 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
185a0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
185b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
185c0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
185d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
185e0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
185f0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
18600 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
18610 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
18620 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
18630 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
18640 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
18650 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
18660 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
18670 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
18680 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
18690 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
186a0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
186b0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
186c0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
186d0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
186e0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
186f0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
18700 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
18710 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
18720 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
18730 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
18740 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
18750 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
18760 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
18770 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
18780 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
18790 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
187a0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
187b0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
187c0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
187d0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
187e0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
187f0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
18800 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
18810 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
18820 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
18830 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
18840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
18850 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
18860 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
18870 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
18880 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
18890 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
188a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
188b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
188c0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
188d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
188e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
188f0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
18900 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
18910 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
18920 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
18930 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
18940 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
18950 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
18960 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
18970 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
18980 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
18990 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
189a0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
189b0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
189c0 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
189d0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
189e0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
189f0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
18a00 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
18a10 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
18a20 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
18a30 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
18a40 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
18a50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18a60 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
18a70 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
18a80 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
18a90 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
18aa0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
18ab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ac0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
18ad0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18ae0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
18af0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
18b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18b10 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
18b20 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
18b30 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
18b40 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
18b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b60 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
18b70 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
18b80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
18b90 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18ba0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
18bb0 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
18bc0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
18bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18be0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18c00 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
18c10 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
18c20 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
18c30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18c40 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
18c50 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
18c60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
18c70 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
18c80 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
18c90 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
18ca0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
18cb0 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
18cc0 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
18cd0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
18ce0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
18cf0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
18d00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
18d10 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
18d20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
18d30 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
18d40 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
18d50 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
18d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18d70 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18d80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18da0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
18db0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
18dc0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
18dd0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
18de0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
18df0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
18e00 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
18e10 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
18e20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
18e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18e40 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
18e50 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
18e60 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
18e70 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
18e80 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
18e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ea0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18eb0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
18ec0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
18ed0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
18ee0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
18ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18f00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18f10 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
18f20 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
18f30 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
18f40 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
18f50 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
18f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
18f70 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
18f80 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
18f90 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
18fa0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
18fb0 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
18fc0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
18fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18fe0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
18ff0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
19000 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
19010 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
19020 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
19030 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
19040 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
19050 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
19060 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
19070 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
19080 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
19090 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
190a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
190b0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
190c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
190d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
190e0 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
190f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
19100 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
19110 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
19120 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
19130 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
19140 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
19150 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
19160 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
19170 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
19180 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
19190 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
191a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
191b0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
191c0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
191d0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
191e0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
191f0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
19200 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
19210 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
19220 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
19230 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
19240 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
19250 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
19260 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
19270 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
19280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
19290 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
192a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
192b0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
192c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
192d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
192e0 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
192f0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
19300 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
19310 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
19320 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
19330 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
19340 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
19350 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
19360 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
19370 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
19380 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
19390 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
193a0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
193b0 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
193c0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
193d0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
193e0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
193f0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
19400 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
19410 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
19420 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
19430 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
19440 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
19450 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
19460 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
19470 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
19480 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
19490 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
194a0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
194b0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
194c0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
194d0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
194e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
194f0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
19500 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
19510 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
19520 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
19530 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
19540 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
19550 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
19560 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
19570 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
19580 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
19590 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
195a0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
195b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
195c0 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
195d0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
195e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
195f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
19600 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
19610 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
19620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19630 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
19640 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
19650 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
19660 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
19670 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
19680 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
19690 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
196a0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
196b0 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
196c0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
196d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
196e0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
196f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
19700 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
19710 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
19720 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
19730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19740 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19750 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
19760 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
19770 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
19780 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
19790 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
197a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
197b0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
197c0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
197d0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
197e0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
197f0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
19800 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
19810 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
19820 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
19830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
19840 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
19850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
19860 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
19870 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
19880 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
19890 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
198a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
198b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
198c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
198d0 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
198e0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
198f0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
19900 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
19910 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
19920 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
19930 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
19940 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
19950 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
19960 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19970 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
19980 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
19990 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
199a0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
199b0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
199c0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
199d0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
199e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
199f0 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
19a00 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
19a10 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
19a20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19a40 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
19a50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
19a60 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
19a70 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
19a80 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
19a90 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
19aa0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
19ab0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
19ac0 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
19ad0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
19ae0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
19af0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
19b00 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
19b10 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
19b20 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
19b30 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
19b40 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
19b50 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
19b60 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
19b70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
19b80 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
19b90 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
19ba0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
19bb0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
19bc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
19bd0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
19be0 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
19bf0 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
19c00 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
19c10 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
19c20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
19c30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
19c40 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
19c50 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
19c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19c70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19c80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19c90 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
19ca0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
19cb0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
19cc0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
19cd0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
19ce0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
19cf0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
19d00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
19d10 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
19d20 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
19d30 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
19d40 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
19d50 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
19d60 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
19d70 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
19d80 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
19d90 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
19da0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
19db0 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
19dc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
19dd0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
19de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
19df0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
19e00 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
19e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
19e20 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
19e30 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
19e40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
19e50 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
19e60 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
19e70 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
19e80 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
19e90 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
19ea0 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
19eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19ec0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
19ed0 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
19ee0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
19ef0 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
19f00 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
19f10 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
19f20 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
19f30 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
19f40 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
19f50 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
19f60 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19f70 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
19f80 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
19f90 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
19fa0 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
19fb0 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20  de->hFile.h, .  
19fc0 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
19fd0 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
19fe0 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
19ff0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1a000 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1a010 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20  _HAS_ANSI).     
1a020 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1a030 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
1a040 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
1a050 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1a060 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1a070 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1a080 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1a090 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a0a0 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63  SHM-MAP pid-%d c
1a0b0 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20  reate region=%d 
1a0c0 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a  nbyte=%d %s\n",.
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a0e0 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
1a0f0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1a100 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1a110 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
1a120 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
1a130 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1a140 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1a150 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
1a160 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
1a170 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
1a180 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
1a190 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1a1a0 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1a1b0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1a1c0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
1a1d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1a1e0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1a1f0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1a200 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
1a210 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
1a220 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
1a230 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
1a240 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1a250 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1a260 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1a270 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
1a280 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1a290 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
1a2a0 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1a2b0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1a2c0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
1a2d0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1a2e0 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1a2f0 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1a300 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1a310 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1a320 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
1a330 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f   map region=%d o
1a340 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64  ffset=%d size=%d
1a350 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1a360 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
1a370 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a380 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1a390 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
1a3a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1a3b0 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
1a3c0 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1a3d0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
1a3e0 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
1a3f0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
1a400 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
1a410 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1a420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a430 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1a440 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
1a450 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1a460 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1a470 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1a480 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p3", pDbFd->zPat
1a490 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
1a4a0 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61  hMap ) osCloseHa
1a4b0 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
1a4c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1a4d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a4e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1a4f0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1a500 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
1a510 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
1a520 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
1a530 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1a540 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
1a550 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1a560 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1a570 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1a580 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1a590 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1a5a0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
1a5b0 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
1a5c0 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
1a5d0 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1a5e0 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1a5f0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1a600 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
1a610 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
1a620 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
1a630 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
1a640 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
1a650 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
1a660 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
1a670 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
1a680 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1a690 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1a6a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1a6b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1a6c0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1a6d0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
1a6e0 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
1a6f0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1a700 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
1a710 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
1a720 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
1a730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a740 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
1a750 20 41 72 67 75 6d 65 6e 74 73 20 78 20 61 6e 64   Arguments x and
1a760 20 79 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65   y are both inte
1a770 67 65 72 73 2e 20 41 72 67 75 6d 65 6e 74 20 79  gers. Argument y
1a780 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
1a790 20 6f 66 20 32 2e 0a 2a 2a 20 52 6f 75 6e 64 20   of 2..** Round 
1a7a0 78 20 75 70 20 74 6f 20 74 68 65 20 6e 65 61 72  x up to the near
1a7b0 65 73 74 20 69 6e 74 65 67 65 72 20 6d 75 6c 74  est integer mult
1a7c0 69 70 6c 65 20 6f 66 20 79 2e 20 46 6f 72 20 65  iple of y. For e
1a7d0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
1a7e0 20 20 52 4f 55 4e 44 55 50 28 30 2c 20 20 38 29    ROUNDUP(0,  8)
1a7f0 20 2d 3e 20 20 30 0a 2a 2a 20 20 20 20 20 52 4f   ->  0.**     RO
1a800 55 4e 44 55 50 28 31 33 2c 20 38 29 20 2d 3e 20  UNDUP(13, 8) -> 
1a810 31 36 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44 55  16.**     ROUNDU
1a820 50 28 33 32 2c 20 38 29 20 2d 3e 20 33 32 0a 2a  P(32, 8) -> 32.*
1a830 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e 44 55  /.#define ROUNDU
1a840 50 28 78 2c 79 29 20 20 20 20 20 28 28 28 78 29  P(x,y)     (((x)
1a850 2b 79 2d 31 29 26 7e 28 79 2d 31 29 29 0a 0a 2f  +y-1)&~(y-1))../
1a860 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74  *.** Cleans up t
1a870 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
1a880 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
1a890 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a  d file, if any..
1a8a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a8b0 6e 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  nUnmap(.  sqlite
1a8c0 33 5f 66 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20  3_file *id.){.  
1a8d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
1a8e0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
1a8f0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
1a900 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
1a910 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1a920 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1a930 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1a940 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1a950 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1a960 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1a970 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1a980 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1a990 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1a9a0 52 5f 4d 52 45 4d 41 50 2c 20 70 46 69 6c 65 2d  R_MREMAP, pFile-
1a9b0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 31 22       "winUnmap1"
1a9e0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1a9f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1aa00 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
1aa10 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1aa20 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pSize = 0;.  }. 
1aa30 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
1aa40 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
1aa50 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
1aa60 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
1aa70 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1aa80 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1aa90 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1aaa0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1aab0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1aac0 52 5f 4d 52 45 4d 41 50 2c 20 70 46 69 6c 65 2d  R_MREMAP, pFile-
1aad0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 32 22       "winUnmap2"
1ab00 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1ab10 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1ab20 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1ab30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ab40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ab50 4d 61 70 2c 20 72 65 6d 61 70 20 6f 72 20 75 6e  Map, remap or un
1ab60 6d 61 70 20 70 61 72 74 20 6f 66 20 74 68 65 20  map part of the 
1ab70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ab80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1ab90 4d 72 65 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  Mremap(.  sqlite
1aba0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
1abb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
1abc0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1abd0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ac00 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 58 58  SQLITE_MREMAP_XX
1ac10 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
1ac20 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 2c  ite3_int64 iOff,
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac40 4f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  Offset to start 
1ac50 6d 61 70 70 69 6e 67 20 61 74 20 2a 2f 0a 20 20  mapping at */.  
1ac60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4f  sqlite3_int64 nO
1ac70 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
1ac80 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 6c 64 20 6d  /* Size of old m
1ac90 61 70 70 69 6e 67 2c 20 6f 72 20 7a 65 72 6f 20  apping, or zero 
1aca0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1acb0 36 34 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20  64 nNew,        
1acc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1acd0 6e 65 77 20 6d 61 70 70 69 6e 67 2c 20 6f 72 20  new mapping, or 
1ace0 7a 65 72 6f 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  zero */.  void *
1acf0 2a 70 70 4d 61 70 20 20 20 20 20 20 20 20 20 20  *ppMap          
1ad00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1ad10 4f 55 54 3a 20 4f 6c 64 2f 6e 65 77 20 6d 61 70  OUT: Old/new map
1ad20 70 69 6e 67 73 20 2a 2f 0a 29 7b 0a 20 20 77 69  pings */.){.  wi
1ad30 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
1ad40 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
1ad50 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1ad60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1ad70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ad80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1ad90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ada0 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  e */.  HANDLE hM
1adb0 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
1adc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6d 61         /* New ma
1add0 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a  pping handle */.
1ade0 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30    void *pNew = 0
1adf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ae00 20 20 2f 2a 20 4e 65 77 20 6d 61 70 70 69 6e 67    /* New mapping
1ae10 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 52 6e   */.  i64 nNewRn
1ae20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ae30 20 20 20 20 20 20 2f 2a 20 6e 4e 65 77 20 72 6f        /* nNew ro
1ae40 75 6e 64 65 64 20 75 70 20 2a 2f 0a 20 20 69 36  unded up */.  i6
1ae50 34 20 6e 4f 6c 64 52 6e 64 3b 20 20 20 20 20 20  4 nOldRnd;      
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae70 20 6e 4f 6c 64 20 72 6f 75 6e 64 65 64 20 75 70   nOld rounded up
1ae80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ae90 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
1aea0 65 72 74 28 20 69 4f 66 66 3d 3d 30 20 29 3b 0a  ert( iOff==0 );.
1aeb0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 3d    assert( nOld>=
1aec0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1aed0 4f 6c 64 3d 3d 30 20 7c 7c 20 70 46 69 6c 65 2d  Old==0 || pFile-
1aee0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 28 2a 70  >pMapRegion==(*p
1aef0 70 4d 61 70 29 20 29 3b 0a 20 20 61 73 73 65 72  pMap) );.  asser
1af00 74 28 20 6e 4e 65 77 3e 3d 30 20 29 3b 0a 20 20  t( nNew>=0 );.  
1af10 61 73 73 65 72 74 28 20 70 70 4d 61 70 20 29 3b  assert( ppMap );
1af20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1af30 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 7c 7c 20  ->hMap==NULL || 
1af40 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1af50 6e 3d 3d 28 2a 70 70 4d 61 70 29 20 29 3b 0a 20  n==(*ppMap) );. 
1af60 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1af70 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 7c 7c  pMapRegion==0 ||
1af80 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1af90 6f 6e 3d 3d 28 2a 70 70 4d 61 70 29 20 29 3b 0a  on==(*ppMap) );.
1afa0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 46 69    /* assert( pFi
1afb0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 6e 4f  le->mmapSize==nO
1afc0 6c 64 20 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65  ld ); */..  asse
1afd0 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
1afe0 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 20  wPageSize>0 );. 
1aff0 20 6e 4e 65 77 52 6e 64 20 3d 20 52 4f 55 4e 44   nNewRnd = ROUND
1b000 55 50 28 6e 4e 65 77 2c 20 77 69 6e 53 79 73 49  UP(nNew, winSysI
1b010 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 2a 31  nfo.dwPageSize*1
1b020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
1b030 77 52 6e 64 3e 3d 30 20 29 3b 0a 20 20 6e 4f 6c  wRnd>=0 );.  nOl
1b040 64 52 6e 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e  dRnd = ROUNDUP(n
1b050 4f 6c 64 2c 20 77 69 6e 53 79 73 49 6e 66 6f 2e  Old, winSysInfo.
1b060 64 77 50 61 67 65 53 69 7a 65 2a 31 29 3b 0a 20  dwPageSize*1);. 
1b070 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 52 6e 64   assert( nOldRnd
1b080 3e 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4e  >=0 );..  if( nN
1b090 65 77 52 6e 64 3d 3d 6e 4f 6c 64 52 6e 64 20 29  ewRnd==nOldRnd )
1b0a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  {.    pFile->mma
1b0b0 70 53 69 7a 65 20 3d 20 6e 4e 65 77 3b 0a 20 20  pSize = nNew;.  
1b0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b0d0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
1b0e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 52 45 4d   the SQLITE_MREM
1b0f0 41 50 5f 45 58 54 45 4e 44 20 66 6c 61 67 20 69  AP_EXTEND flag i
1b100 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
1b110 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 71 75  size of the requ
1b120 65 73 74 65 64 0a 20 20 2a 2a 20 6d 61 70 70 69  ested.  ** mappi
1b130 6e 67 20 28 6e 4e 65 77 20 62 79 74 65 73 29 20  ng (nNew bytes) 
1b140 6d 61 79 20 62 65 20 67 72 65 61 74 65 72 20 74  may be greater t
1b150 68 61 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  han the size of 
1b160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b170 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  e..  ** If this 
1b180 69 73 20 74 68 65 20 63 61 73 65 2c 20 65 78 74  is the case, ext
1b190 65 6e 64 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  end the file on 
1b1a0 64 69 73 6b 20 75 73 69 6e 67 20 66 74 72 75 6e  disk using ftrun
1b1b0 63 61 74 65 28 29 2e 20 20 2a 2f 0a 20 20 61 73  cate().  */.  as
1b1c0 73 65 72 74 28 20 6e 4e 65 77 52 6e 64 3e 30 20  sert( nNewRnd>0 
1b1d0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
1b1e0 54 45 5f 4d 52 45 4d 41 50 5f 45 58 54 45 4e 44  TE_MREMAP_EXTEND
1b1f0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c  )==0 );.  if( fl
1b200 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4d 52 45  ags & SQLITE_MRE
1b210 4d 41 50 5f 45 58 54 45 4e 44 20 29 7b 0a 20 20  MAP_EXTEND ){.  
1b220 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b230 6f 6c 64 53 7a 3b 0a 20 20 20 20 72 63 20 3d 20  oldSz;.    rc = 
1b240 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
1b250 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 69 66 28  &oldSz);.    if(
1b260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b270 26 20 6e 4e 65 77 52 6e 64 3e 6f 6c 64 53 7a 20  & nNewRnd>oldSz 
1b280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1b290 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 4e  nTruncate(id, nN
1b2a0 65 77 52 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20  ewRnd);.    }.  
1b2b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b2c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b2d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
1b2e0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 75   get this far, u
1b2f0 6e 6d 61 70 20 61 6e 79 20 6f 6c 64 20 6d 61 70  nmap any old map
1b300 70 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ping. */.  rc = 
1b310 77 69 6e 55 6e 6d 61 70 28 69 64 29 3b 0a 20 20  winUnmap(id);.  
1b320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b330 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1b340 20 20 2f 2a 20 41 6e 64 2c 20 69 66 20 72 65 71    /* And, if req
1b350 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 61 20  uired, create a 
1b360 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a  new mapping. */.
1b370 20 20 69 66 28 20 6e 4e 65 77 52 6e 64 3e 30 20    if( nNewRnd>0 
1b380 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
1b390 74 20 3d 20 28 28 69 4f 66 66 20 2f 20 77 69 6e  t = ((iOff / win
1b3a0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1b3b0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 29  tionGranularity)
1b3c0 20 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   *.             
1b3d0 20 20 20 20 20 28 77 69 6e 53 79 73 49 6e 66 6f       (winSysInfo
1b3e0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1b3f0 6e 75 6c 61 72 69 74 79 29 29 3b 0a 20 20 20 20  nularity));.    
1b400 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
1b410 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
1b420 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
1b430 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
1b440 20 20 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e      if( (pFile->
1b450 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
1b460 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
1b470 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
1b480 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
1b490 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
1b4a0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
1b4b0 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
1b4c0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68  E_OS_WINRT.    h
1b4d0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1b4e0 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1b4f0 28 70 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 2c  (pFile->h, NULL,
1b500 20 70 72 6f 74 65 63 74 2c 20 6e 4e 65 77 52 6e   protect, nNewRn
1b510 64 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  d, NULL);.#elif 
1b520 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1b530 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1b540 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1b550 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1b560 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  File->h, NULL, p
1b570 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1b5a0 28 6e 4e 65 77 52 6e 64 3e 3e 33 32 29 20 26 20  (nNewRnd>>32) & 
1b5b0 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1b5e0 4f 52 44 29 28 6e 4e 65 77 52 6e 64 20 26 20 30  ORD)(nNewRnd & 0
1b5f0 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1b600 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1b610 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b620 53 5f 41 4e 53 49 29 0a 20 20 20 20 68 4d 61 70  S_ANSI).    hMap
1b630 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1b640 61 70 70 69 6e 67 41 28 70 46 69 6c 65 2d 3e 68  appingA(pFile->h
1b650 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1b660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 28 44 57 4f 52 44 29 28 28 6e 4e 65 77 52 6e   (DWORD)((nNewRn
1b690 64 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  d>>32) & 0xfffff
1b6a0 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6c0 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4e        (DWORD)(nN
1b6d0 65 77 52 6e 64 20 26 20 30 78 66 66 66 66 66 66  ewRnd & 0xffffff
1b6e0 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ff), NULL);.#end
1b6f0 69 66 0a 20 20 20 20 69 66 28 20 68 4d 61 70 3d  if.    if( hMap=
1b700 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
1b710 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1b720 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1b730 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1b740 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1b750 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41 50 2c 20  E_IOERR_MREMAP, 
1b760 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1b770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b780 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 72 65           "winMre
1b790 6d 61 70 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  map1", pFile->zP
1b7a0 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
1b7b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b7c0 20 61 73 73 65 72 74 28 20 28 6e 4e 65 77 52 6e   assert( (nNewRn
1b7d0 64 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  d % winSysInfo.d
1b7e0 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b  wPageSize)==0 );
1b7f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b800 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
1b810 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1b820 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 66 6c 61  romApp(hMap, fla
1b830 67 73 2c 20 6f 66 66 73 65 74 2c 20 6e 4e 65 77  gs, offset, nNew
1b840 52 6e 64 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Rnd);.#else.    
1b850 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
1b860 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
1b870 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
1b880 20 6e 4e 65 77 52 6e 64 3c 3d 30 78 66 66 66 66   nNewRnd<=0xffff
1b890 66 66 66 66 20 29 3b 0a 20 20 20 20 70 4e 65 77  ffff );.    pNew
1b8a0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1b8b0 6c 65 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a  le(hMap, flags,.
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1b8e0 44 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  D)((offset>>32) 
1b8f0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1b920 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
1b930 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 28 53 49 5a 45 5f 54 29 6e 4e 65 77 52     (SIZE_T)nNewR
1b960 6e 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nd);.#endif.    
1b970 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
1b980 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
1b990 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
1b9a0 20 20 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a     hMap = NULL;.
1b9b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1b9c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1b9d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1b9e0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1b9f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1ba00 52 45 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  REMAP, pFile->la
1ba10 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 22 77 69 6e 4d 72 65 6d 61 70 32 22 2c 20 70 46  "winMremap2", pF
1ba40 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1ba50 20 7d 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d   }.  }..  pFile-
1ba60 3e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  >hMap = hMap;.  
1ba70 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ba80 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 70 46 69 6c  n = pNew;.  pFil
1ba90 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4e  e->mmapSize = nN
1baa0 65 77 3b 0a 0a 20 20 2a 70 70 4d 61 70 20 3d 20  ew;..  *ppMap = 
1bab0 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72  pNew;.  return r
1bac0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  c;.}../*.** Here
1bad0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1bae0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1baf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1bb00 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1bb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1bb20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1bb30 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1bb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1bb60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bba0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1bbb0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
1bbc0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
1bbd0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
1bbe0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
1bbf0 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
1bc00 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
1bc10 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1bc20 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
1bc30 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1bc60 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
1bc70 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1bc90 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
1bca0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
1bcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1bcc0 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
1bcd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1bce0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1bcf0 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
1bd00 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1bd10 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1bd20 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
1bd30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1bd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
1bd50 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
1bd60 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1bd70 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1bd80 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
1bd90 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1bda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1bdb0 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
1bdc0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1bdd0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1bde0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
1bdf0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
1be00 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
1be10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
1be20 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
1be30 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1be40 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
1be50 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
1be60 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1be70 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
1be80 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
1be90 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1bea0 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
1beb0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1bec0 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
1bed0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
1bee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1bef0 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
1bf00 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1bf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1bf20 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
1bf30 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1bf50 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
1bf60 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
1bf90 20 20 77 69 6e 4d 72 65 6d 61 70 2c 20 20 20 20    winMremap,    
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfb0 20 20 2f 2a 20 78 4d 72 65 6d 61 70 20 2a 2f 0a    /* xMremap */.
1bfc0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
1bfd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bfe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c010 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1c020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
1c030 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
1c040 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1c050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c060 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
1c070 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1c080 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c090 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
1c0a0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
1c0b0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
1c0c0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
1c0d0 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
1c0e0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
1c0f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1c100 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1c110 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
1c120 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
1c130 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
1c140 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
1c150 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
1c160 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1c170 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
1c180 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1c190 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74  ic void *convert
1c1a0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
1c1b0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1c1c0 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
1c1d0 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
1c1e0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1c1f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74   zConverted = ut
1c200 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
1c210 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
1c220 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1c230 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1c240 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
1c250 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1c260 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69  utf8_to_mbcs(zFi
1c270 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
1c280 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
1c290 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
1c2a0 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
1c2b0 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
1c2c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c2d0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
1c2e0 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
1c2f0 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
1c300 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
1c310 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78  hold at pVfs->mx
1c320 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74  Pathname charact
1c330 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1c340 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69  nt getTempname(i
1c350 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1c360 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
1c370 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
1c380 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
1c390 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
1c3a0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
1c3b0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
1c3c0 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
1c3d0 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
1c3e0 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70 50 61 74  ;.  int nTempPat
1c3f0 68 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50  h;.  char zTempP
1c400 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b  ath[MAX_PATH+2];
1c410 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
1c420 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
1c430 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
1c440 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
1c450 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
1c460 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
1c470 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
1c480 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
1c490 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
1c4a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
1c4b0 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
1c4c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1c4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c4e0 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 7a  R );..  memset(z
1c4f0 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 4d 41 58  TempPath, 0, MAX
1c500 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69 66 28  _PATH+2);..  if(
1c510 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
1c520 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
1c530 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c540 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
1c550 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71  mpPath, "%s", sq
1c560 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1c570 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21  tory);.  }.#if !
1c580 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1c590 20 20 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28    else if( isNT(
1c5a0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
1c5b0 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52  Multi;.    WCHAR
1c5c0 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50   zWidePath[MAX_P
1c5d0 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54  ATH];.    osGetT
1c5e0 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54  empPathW(MAX_PAT
1c5f0 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29  H-30, zWidePath)
1c600 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75  ;.    zMulti = u
1c610 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
1c620 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
1c630 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
1c640 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1c650 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
1c660 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
1c670 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
1c680 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
1c690 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ti);.    }else{.
1c6a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c6b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1c6c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
1c6d0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1c6e0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1c6f0 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
1c700 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50  .    char zMbcsP
1c710 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
1c720 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68     osGetTempPath
1c730 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  A(MAX_PATH-30, z
1c740 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a  MbcsPath);.    z
1c750 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77  Utf8 = sqlite3_w
1c760 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1c770 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  8(zMbcsPath);.  
1c780 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20    if( zUtf8 ){. 
1c790 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1c7a0 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33  rintf(MAX_PATH-3
1c7b0 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
1c7c0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
1c7d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1c7e0 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Utf8);.    }else
1c7f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1c800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c810 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  M;.    }.  }.#en
1c820 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  dif.#endif..  /*
1c830 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1c840 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
1c850 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
1c860 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
1c870 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
1c880 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
1c890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1c8a0 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d 70  OR..  */.  nTemp
1c8b0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74  Path = sqlite3St
1c8c0 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
1c8d0 29 3b 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d 70  );..  if( (nTemp
1c8e0 50 61 74 68 20 2b 20 73 71 6c 69 74 65 33 53 74  Path + sqlite3St
1c8f0 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
1c900 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
1c910 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b  + 18) >= nBuf ){
1c920 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c930 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
1c940 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74 68   for(i=nTempPath
1c950 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61  ; i>0 && zTempPa
1c960 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69  th[i-1]=='\\'; i
1c970 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74  --){}.  zTempPat
1c980 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  h[i] = 0;..  sql
1c990 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1c9a0 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e 54  uf-18, zBuf, (nT
1c9b0 65 6d 70 50 61 74 68 20 3e 20 30 29 20 3f 0a 20  empPath > 0) ?. 
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49        "%s\\"SQLI
1c9e0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
1c9f0 46 49 58 20 3a 20 53 51 4c 49 54 45 5f 54 45 4d  FIX : SQLITE_TEM
1ca00 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a 20  P_FILE_PREFIX,. 
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20    zTempPath);.  
1ca30 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
1ca40 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
1ca50 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1ca60 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
1ca70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
1ca80 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
1ca90 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
1caa0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
1cab0 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
1cac0 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
1cad0 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
1cae0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b  [j] = 0;.  zBuf[
1caf0 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54  j+1] = 0;..  OST
1cb00 52 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45  RACE(("TEMP FILE
1cb10 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75  NAME: %s\n", zBu
1cb20 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  f));.  return SQ
1cb30 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
1cb40 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1cb50 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
1cb60 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72   is really a dir
1cb70 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20  ectory.  Return 
1cb80 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69  false if.** it i
1cb90 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1cba0 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f  r than a directo
1cbb0 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20  ry, or if there 
1cbc0 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d  is any kind of m
1cbd0 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
1cbe0 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a  ion failure..*/.
1cbf0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
1cc00 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
1cc10 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44  zConverted){.  D
1cc20 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
1cc30 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
1cc40 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69   lastErrno;..  i
1cc50 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1cc60 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1cc70 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
1cc80 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
1cc90 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
1cca0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
1ccb0 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
1ccc0 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
1ccd0 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
1cce0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
1ccf0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1cd00 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
1cd30 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
1cd60 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26   && retryIoerr(&
1cd70 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1cd80 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63   ){}.    if( !rc
1cd90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cda0 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e   0; /* Invalid n
1cdb0 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ame? */.    }.  
1cdc0 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
1cdd0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
1cde0 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  tes;.#if SQLITE_
1cdf0 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
1ce00 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
1ce10 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1ce20 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
1ce30 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
1ce40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74    }.  return (at
1ce50 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
1ce60 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20  _ATTRIBUTES) && 
1ce70 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49  (attr&FILE_ATTRI
1ce80 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b  BUTE_DIRECTORY);
1ce90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1cea0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1ceb0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
1cec0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1ced0 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  s,        /* Not
1cee0 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
1cef0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
1cf00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cf10 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
1cf20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
1cf30 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
1cf40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
1cf50 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
1cf60 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
1cf70 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1cf80 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
1cf90 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
1cfa0 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
1cfb0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
1cfc0 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
1cfd0 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
1cfe0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1cff0 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69  ;.  DWORD dwDesi
1d000 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f  redAccess;.  DWO
1d010 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a  RD dwShareMode;.
1d020 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69    DWORD dwCreati
1d030 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20  onDisposition;. 
1d040 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e   DWORD dwFlagsAn
1d050 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b  dAttributes = 0;
1d060 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d070 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d  INCE.  int isTem
1d080 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  p = 0;.#endif.  
1d090 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
1d0a0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
1d0b0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1d0c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d0d0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f  /* Filename in O
1d0e0 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  S encoding */.  
1d0f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66  const char *zUtf
1d100 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f  8Name = zName; /
1d110 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54  * Filename in UT
1d120 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  F-8 encoding */.
1d130 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a    int cnt = 0;..
1d140 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
1d150 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
1d160 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
1d170 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
1d180 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
1d190 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1d1a0 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
1d1b0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
1d1c0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
1d1d0 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
1d1e0 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 20  me[MAX_PATH+2]; 
1d1f0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
1d200 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d  ed to create tem
1d210 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20  p filename */.. 
1d220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d230 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1d240 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
1d250 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
1d260 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1d270 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1d280 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
1d290 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
1d2a0 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
1d2b0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
1d2c0 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
1d2d0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
1d2e0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1d2f0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
1d300 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
1d310 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1d320 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1d330 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
1d340 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
1d350 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1d360 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
1d370 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
1d380 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1d390 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
1d3a0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
1d3b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1d3c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1d3d0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
1d3e0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
1d3f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
1d400 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
1d410 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
1d420 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1d430 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
1d440 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1d450 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
1d460 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1d470 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
1d480 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
1d490 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
1d4a0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
1d4b0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
1d4c0 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
1d4d0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
1d4e0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
1d4f0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
1d500 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
1d510 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
1d520 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
1d530 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
1d540 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
1d550 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
1d560 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
1d570 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
1d580 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
1d590 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
1d5a0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
1d5b0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1d5c0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1d5d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
1d5e0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
1d5f0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
1d600 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
1d610 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
1d620 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
1d630 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1d640 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
1d650 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
1d660 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
1d670 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
1d680 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
1d690 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
1d6a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
1d6b0 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
1d6c0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
1d6d0 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
1d6e0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
1d6f0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
1d700 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
1d710 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
1d720 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1d730 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1d740 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1d750 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
1d760 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1d770 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1d780 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1d790 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
1d7a0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1d7b0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1d7c0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1d7d0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1d7e0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
1d7f0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1d800 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1d810 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
1d820 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1d830 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
1d840 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
1d850 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
1d860 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
1d870 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
1d880 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1d890 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1d8a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1d8b0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
1d8c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1d8d0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
1d8e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1d8f0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1d900 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1d910 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1d920 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
1d930 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1d940 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1d950 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1d960 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1d970 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
1d980 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1d990 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
1d9a0 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
1d9b0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
1d9c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  e, 0, sizeof(win
1d9d0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
1d9e0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1d9f0 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20  DLE_VALUE;..#if 
1da00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1da10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 74    if( !sqlite3_t
1da20 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
1da30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
1da40 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
1da50 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
1da60 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
1da70 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
1da80 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
1da90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1daa0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
1dab0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
1dac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
1dad0 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
1dae0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
1daf0 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
1db00 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
1db10 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
1db20 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
1db30 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
1db40 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 54  );.    memset(zT
1db50 6d 70 6e 61 6d 65 2c 20 30 2c 20 4d 41 58 5f 50  mpname, 0, MAX_P
1db60 41 54 48 2b 32 29 3b 0a 20 20 20 20 72 63 20 3d  ATH+2);.    rc =
1db70 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58   getTempname(MAX
1db80 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d  _PATH+2, zTmpnam
1db90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1dba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dbb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dbc0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
1dbd0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
1dbe0 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
1dbf0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
1dc00 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
1dc10 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
1dc20 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
1dc30 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
1dc40 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
1dc50 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
1dc60 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1dc70 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1dc80 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
1dc90 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
1dca0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1dcb0 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
1dcc0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
1dcd0 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e  |.        zUtf8N
1dce0 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38  ame[strlen(zUtf8
1dcf0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
1dd00 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
1dd10 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
1dd20 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
1dd30 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
1dd40 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1dd50 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
1dd60 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1dd70 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1dd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dd90 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
1dda0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
1ddb0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
1ddc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1ddd0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
1dde0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1ddf0 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
1de00 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
1de10 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
1de20 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
1de30 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
1de40 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
1de50 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
1de60 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
1de70 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
1de80 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
1de90 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
1dea0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1deb0 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  t a new file is 
1dec0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
1ded0 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
1dee0 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
1def0 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
1df00 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20  ss" .  ** as it 
1df10 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
1df20 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
1df30 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
1df40 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
1df50 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
1df60 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
1df70 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
1df80 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
1df90 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
1dfa0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
1dfb0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1dfc0 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
1dfd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
1dfe0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
1dff0 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
1e000 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
1e010 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
1e020 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
1e030 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
1e040 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
1e050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1e060 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
1e070 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
1e080 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1e090 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1e0a0 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
1e0b0 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
1e0c0 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
1e0d0 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
1e0e0 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
1e0f0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
1e100 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1e110 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1e120 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1e130 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
1e140 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
1e150 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
1e160 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1e170 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1e180 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
1e1b0 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
1e1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
1e1f0 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
1e200 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1e210 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1e220 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1e230 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
1e240 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
1e250 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
1e260 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
1e270 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
1e280 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
1e290 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
1e2a0 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
1e2b0 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
1e2c0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
1e2d0 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
1e2e0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
1e2f0 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1e300 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
1e310 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ..  if( isNT() )
1e320 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1e330 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
1e340 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
1e350 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
1e360 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
1e370 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1e380 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
1e390 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
1e3a0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
1e3b0 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
1e3c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
1e3d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
1e3f0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1e400 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
1e410 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
1e420 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1e430 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
1e440 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1e450 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
1e460 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
1e470 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
1e480 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
1e490 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
1e4a0 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
1e4b0 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
1e4c0 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
1e4d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
1e4e0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1e4f0 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
1e500 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
1e510 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1e520 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
1e530 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
1e560 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
1e590 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1e5c0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
1e5f0 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
1e600 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1e610 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
1e640 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1e650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e660 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
1e670 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
1e680 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
1e690 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
1e6a0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
1e6d0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
1e700 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
1e730 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
1e740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1e760 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1e770 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
1e7a0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1e7b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7d0 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
1e7e0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
1e7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e800 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
1e810 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
1e820 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e830 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1e840 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1e850 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
1e860 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
1e870 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1e8a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
1e8d0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1e900 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
1e930 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
1e960 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1e970 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
1e9a0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1e9b0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1e9c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
1e9d0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
1e9e0 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  if.  logIoerr(cn
1e9f0 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  t);..  OSTRACE((
1ea00 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25 6c  "OPEN %d %s 0x%l
1ea10 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  x %s\n", .      
1ea20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64       h, zName, d
1ea30 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
1ea40 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d 49  .           h==I
1ea50 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ea60 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  LUE ? "failed" :
1ea70 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20   "ok"));..  if( 
1ea80 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
1ea90 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70  E_VALUE ){.    p
1eaa0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1eab0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
1eac0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ead0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
1eae0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
1eaf0 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
1eb00 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1eb10 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1eb20 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  ed);.    if( isR
1eb30 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
1eb40 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
1eb50 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
1eb60 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
1eb70 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c  , .         ((fl
1eb80 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags|SQLITE_OPEN_
1eb90 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20  READONLY) &.    
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   ~(SQLITE_OPEN_C
1ebc0 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
1ebd0 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20  N_READWRITE)),. 
1ebe0 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67          pOutFlag
1ebf0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1ec00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec10 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1ec20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1ec30 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
1ec40 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
1ec50 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ite ){.      *pO
1ec60 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
1ec70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
1ec80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ec90 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
1eca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1ecb0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
1ecc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1ecd0 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
1ece0 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
1ecf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ed00 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72  _DB.       && (r
1ed10 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c  c = winceCreateL
1ed20 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
1ed30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))!=SQLITE_OK.  
1ed40 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
1ed50 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c  ndle(h);.    sql
1ed60 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1ed70 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72  rted);.    retur
1ed80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1ed90 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
1eda0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
1edb0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
1edc0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1edd0 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1ede0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1edf0 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d  );.  }..  pFile-
1ee00 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
1ee10 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
1ee20 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
1ee30 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
1ee40 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
1ee50 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ee60 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
1ee70 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
1ee80 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
1ee90 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
1eea0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
1eeb0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1eec0 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
1eed0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
1eee0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
1eef0 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
1ef00 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
1ef10 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
1ef20 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d   zName;.  pFile-
1ef30 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1ef40 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ef50 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  n = 0;.  pFile->
1ef60 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 20  mmapSize = 0;.. 
1ef70 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
1ef80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ef90 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1efa0 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
1efb0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
1efc0 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
1efd0 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
1efe0 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
1eff0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
1f000 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
1f010 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
1f020 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
1f030 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
1f040 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
1f050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
1f060 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
1f070 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
1f080 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
1f090 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
1f0a0 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
1f0b0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
1f0c0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
1f0d0 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
1f0e0 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
1f0f0 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
1f100 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
1f110 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
1f120 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
1f130 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
1f140 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
1f150 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
1f160 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
1f170 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
1f180 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
1f190 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
1f1a0 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
1f1b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1f1c0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
1f1d0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
1f1e0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
1f1f0 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
1f200 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1f210 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
1f220 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
1f230 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
1f240 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
1f250 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1f260 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
1f270 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1f280 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
1f290 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61  attr;.  DWORD la
1f2a0 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20  stErrno;.  void 
1f2b0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
1f2c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f2d0 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
1f2e0 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
1f2f0 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
1f300 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
1f310 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1f320 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  E);.  zConverted
1f330 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
1f340 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
1f350 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
1f360 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
1f370 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f380 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
1f390 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1f3a0 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
1f3b0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1f3c0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
1f3d0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
1f3e0 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
1f3f0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
1f400 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
1f410 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
1f420 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1f430 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
1f440 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
1f450 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
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 26 73 41 74              &sAt
1f480 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
1f490 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
1f4a0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
1f4b0 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
1f4c0 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
1f4d0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1f4e0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1f4f0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
1f500 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
1f510 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
1f520 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
1f530 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
1f540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f550 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1f560 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
1f570 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
1f580 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1f590 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f5a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1f5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f5c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
1f5d0 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
1f5e0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1f5f0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
1f600 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
1f610 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
1f620 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1f630 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
1f640 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1f650 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1f660 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
1f670 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
1f680 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
1f690 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
1f6a0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
1f6b0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
1f6c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1f6d0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
1f6e0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
1f6f0 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
1f700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1f710 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1f720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f730 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f740 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
1f750 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
1f760 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
1f770 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f780 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
1f790 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
1f7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f7b0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
1f7c0 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
1f7d0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
1f7e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f7f0 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
1f800 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
1f810 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1f820 20 20 69 66 20 28 20 21 72 65 74 72 79 49 6f 65    if ( !retryIoe
1f830 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1f840 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1f850 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1f860 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
1f870 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
1f880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1f890 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
1f8a0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1f8b0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1f8c0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f  I.  else{.    do
1f8d0 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20   {.      attr = 
1f8e0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1f8f0 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
1f900 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  ;.      if ( att
1f910 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
1f920 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
1f930 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
1f940 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1f950 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
1f960 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
1f970 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
1f980 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
1f990 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
1f9a0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
1f9b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1f9c0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1f9d0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
1f9e0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1f9f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fa00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fa10 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1fa20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1fa30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fa40 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
1fa50 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
1fa60 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
1fa70 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1fa80 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
1fa90 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1faa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fab0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
1fac0 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eA(zConverted) )
1fad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fae0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
1faf0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
1fb00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fb10 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 72   }.      if ( !r
1fb20 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1fb30 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1fb40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fb50 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
1fb60 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
1fb70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1fb80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
1fb90 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  ile(1);.  }.#end
1fba0 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  if.  if( rc && r
1fbb0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1fbc0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a  DELETE_NOENT ){.
1fbd0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1fbe0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1fbf0 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
1fc00 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1fc10 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a    "winDelete", z
1fc20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
1fc30 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
1fc40 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
1fc50 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1fc60 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
1fc70 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
1fc80 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
1fc90 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64  e, (rc ? "failed
1fca0 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20  " : "ok" )));.  
1fcb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fcc0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
1fcd0 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
1fce0 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
1fcf0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
1fd00 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
1fd10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1fd20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1fd30 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
1fd40 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1fd50 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
1fd60 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
1fd70 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
1fd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fd90 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
1fda0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
1fdb0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1fdc0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
1fdd0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
1fde0 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
1fdf0 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
1fe00 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
1fe10 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
1fe20 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1fe30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1fe40 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
1fe50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1fe60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1fe70 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43  _ACCESS; );.  zC
1fe80 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1fe90 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1fea0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1feb0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1fec0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1fed0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1fee0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
1fef0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
1ff00 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
1ff10 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1ff20 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1ff30 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1ff40 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1ff50 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1ff60 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
1ff70 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1ff80 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
1ff90 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
1ffc0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
1fff0 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
20000 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
20010 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
20020 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20030 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
20040 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20050 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
20060 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
20070 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
20080 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
20090 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
200a0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
200b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
200c0 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
200d0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
200e0 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
200f0 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
20100 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
20110 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
20120 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
20130 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
20140 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20150 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
20160 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
20170 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
20180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20190 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
201a0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
201b0 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
201c0 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
201d0 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
201e0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
201f0 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72          winLogEr
20200 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20210 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
20220 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
20230 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
20240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20250 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
20260 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
20270 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
20280 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
20290 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
202a0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
202b0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
202c0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
202d0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
202e0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
202f0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
20300 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
20310 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
20320 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
20330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
20340 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
20350 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
20360 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
20370 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
20380 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
20390 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
203a0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
203b0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
203c0 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
203d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
203e0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
203f0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
20400 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
20410 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
20420 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
20430 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
20440 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
20450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20460 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
20470 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
20480 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
20490 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
204a0 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
204b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
204c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
204d0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
204e0 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
204f0 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
20500 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a   verbatim.  If.*
20510 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  * non-zero is re
20520 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
20530 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63   function, the c
20540 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
20550 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75  must simply.** u
20560 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  se the provided 
20570 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74  path name verbat
20580 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20  im -OR- resolve 
20590 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  it into a full p
205a0 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e  ath name.** usin
205b0 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74  g the GetFullPat
205c0 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20  hName Win32 API 
205d0 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61  function (if ava
205e0 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  ilable)..*/.stat
205f0 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72  ic BOOL winIsVer
20600 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20  batimPathname(. 
20610 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
20620 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20  thname.){.  /*. 
20630 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
20640 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
20650 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68   a forward slash
20660 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c   or a backslash,
20670 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20   it is either.  
20680 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e  ** a legal UNC n
20690 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65  ame, a volume re
206a0 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20  lative path, or 
206b0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
206c0 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a   name in the.  *
206d0 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20  * "Unix" format 
206e0 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65  on Windows.  The
206f0 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61  re is no easy wa
20700 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
20710 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  te between.  ** 
20720 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61  the final two ca
20730 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ses; therefore, 
20740 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  we return the sa
20750 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  fer return value
20760 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f   of TRUE.  ** so
20770 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66   that callers of
20780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
20790 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69  ill simply use i
207a0 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f  t verbatim..  */
207b0 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61 6d  .  if ( zPathnam
207c0 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61  e[0]=='/' || zPa
207d0 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20  thname[0]=='\\' 
207e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
207f0 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
20800 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
20810 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
20820 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63  a letter and a c
20830 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65  olon it is eithe
20840 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20  r a volume.  ** 
20850 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72  relative path or
20860 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
20870 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74  h.  Callers of t
20880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
20890 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d  t not.  ** attem
208a0 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61  pt to treat it a
208b0 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  s a relative pat
208c0 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65  h name (i.e. the
208d0 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20  y should simply 
208e0 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62  use.  ** it verb
208f0 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  atim)..  */.  if
20900 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
20910 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
20920 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
20930 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74 75  =':' ){.    retu
20940 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
20950 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65  /*.  ** If we ge
20960 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  t to this point,
20970 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
20980 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72  hould almost cer
20990 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65  tainly be a pure
209a0 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  ly.  ** relative
209b0 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61   one (i.e. not a
209c0 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61   UNC name, not a
209d0 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74  bsolute, and not
209e0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
209f0 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  )..  */.  return
20a00 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   FALSE;.}../*.**
20a10 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
20a20 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
20a30 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
20a40 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
20a50 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
20a60 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
20a70 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
20a80 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
20a90 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
20aa0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
20ab0 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
20ac0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
20ad0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
20ae0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
20af0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
20b00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
20b10 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
20b20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
20b30 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
20b40 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
20b70 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
20b80 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
20b90 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
20ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
20bb0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
20bc0 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
20bd0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
20be0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
20bf0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20c00 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
20c10 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
20c20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
20c30 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50  xPathname>=MAX_P
20c40 41 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ATH );.  assert(
20c50 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
20c60 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
20c70 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
20c80 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
20c90 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
20ca0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
20cb0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
20cc0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
20cd0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
20ce0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
20cf0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
20d00 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
20d10 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
20d20 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
20d30 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
20d40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
20d50 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
20d60 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
20d70 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
20d80 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
20d90 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
20da0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
20db0 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
20dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
20dd0 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 2b  r zOut[MAX_PATH+
20de0 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  1];.    memset(z
20df0 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48  Out, 0, MAX_PATH
20e00 2b 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e 5f  +1);.    cygwin_
20e10 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f 50 4f  conv_path(CCP_PO
20e20 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 7c 43 43 50  SIX_TO_WIN_A|CCP
20e30 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61  _RELATIVE, zRela
20e40 74 69 76 65 2c 20 7a 4f 75 74 2c 0a 20 20 20 20  tive, zOut,.    
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20   MAX_PATH+1);.  
20e70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
20e80 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
20e90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
20ea0 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22   zFull, "%s\\%s"
20eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
20ed0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a  ata_directory, z
20ee0 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
20ef0 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70     cygwin_conv_p
20f00 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ath(CCP_POSIX_TO
20f10 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c 61 74 69 76  _WIN_A, zRelativ
20f20 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29  e, zFull, nFull)
20f30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20f40 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
20f50 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53  ..#if (SQLITE_OS
20f60 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
20f70 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64  _OS_WINRT) && !d
20f80 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
20f90 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
20fa0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
20fb0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f  ITE_ERROR );.  /
20fc0 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
20fd0 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
20fe0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
20ff0 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
21000 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61  */.  /* WinRT ha
21010 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76  s no way to conv
21020 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70  ert a relative p
21030 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ath to an absolu
21040 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  te one. */.  if 
21050 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
21060 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
21070 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
21080 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
21090 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
210a0 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
210b0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
210c0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
210d0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
210e0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
210f0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
21100 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
21110 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
21120 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
21130 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
21140 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
21150 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
21160 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
21170 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
21180 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
21190 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
211a0 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
211b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
211c0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
211d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
211e0 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a  Full, "%s\\%s",.
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
21210 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65  a_directory, zRe
21220 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65  lative);.  }else
21230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
21240 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
21250 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
21260 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
21270 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
21280 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
21290 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
212a0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
212b0 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
212c0 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
212d0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
212e0 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20   DWORD nByte;.  
212f0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
21300 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
21310 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
21320 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
21330 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
21340 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
21350 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
21360 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
21370 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
21380 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
21390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
213a0 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
213b0 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  & sqlite3Isalpha
213c0 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26  (zRelative[1]) &
213d0 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d  & zRelative[2]==
213e0 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  ':' ){.    zRela
213f0 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
21400 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
21410 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
21420 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
21430 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
21440 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
21450 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
21460 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
21470 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
21480 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
21490 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
214a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
214b0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
214c0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
214d0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
214e0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
214f0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
21500 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
21510 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
21520 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
21530 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
21540 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
21550 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
21560 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
21570 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
21580 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
21590 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
215a0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
215b0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
215c0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
215d0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
215e0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
215f0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
21600 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
21610 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
21620 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
21630 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
21640 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
21650 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
21660 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
21670 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
21680 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
21690 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
216a0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
216b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
216c0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25  ), zFull, "%s\\%
216d0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
216e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
216f0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
21700 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
21710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21720 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
21730 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
21740 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
21750 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
21760 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
21770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
21780 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
21790 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
217a0 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
217b0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
217c0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
217d0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
217e0 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
217f0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
21800 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
21810 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
21820 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  OR, osGetLastErr
21830 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
21840 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c          "GetFull
21850 50 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43 6f  PathNameW1", zCo
21860 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21870 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21880 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
218a0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b  NTOPEN_FULLPATH;
218b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
218c0 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
218d0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
218e0 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
218f0 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
21900 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
21910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21920 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
21930 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
21940 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
21950 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
21960 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
21970 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
21980 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
21990 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
219a0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
219b0 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
219c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
219d0 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
219e0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
219f0 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
21a00 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a 43  lPathNameW2", zC
21a10 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21a20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21a30 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21a40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
21a50 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
21a60 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
21a70 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
21a80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21a90 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21aa0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63  .    zOut = unic
21ab0 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29  odeToUtf8(zTemp)
21ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21ad0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
21ae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
21af0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
21b00 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
21b10 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
21b20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
21b30 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
21b40 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
21b50 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
21b60 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
21b70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
21b80 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
21b90 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
21ba0 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
21bb0 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c 20 7a 43  lPathNameA1", zC
21bc0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21be0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21c00 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
21c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
21c20 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
21c30 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
21c40 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
21c50 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
21c60 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
21c70 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
21c80 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
21c90 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
21ca0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21cb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
21cc0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
21cd0 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
21ce0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
21cf0 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
21d00 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
21d10 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
21d20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
21d30 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  OR, osGetLastErr
21d40 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
21d50 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c          "GetFull
21d60 50 61 74 68 4e 61 6d 65 41 32 22 2c 20 7a 43 6f  PathNameA2", zCo
21d70 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21d80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21d90 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21da0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
21db0 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
21dc0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
21dd0 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20  N_FULLPATH;.    
21de0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
21df0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21e00 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
21e10 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
21e20 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
21e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21e40 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
21e50 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
21e60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21e70 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
21e80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
21e90 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
21ea0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
21eb0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
21ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21ed0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
21ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ef0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
21f00 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
21f10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
21f20 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
21f30 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
21f40 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
21f50 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
21f60 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
21f70 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
21f80 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
21f90 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
21fa0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
21fb0 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  */./*.** Interfa
21fc0 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
21fd0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
21fe0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
21ff0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
22000 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
22010 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
22020 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
22030 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
22040 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
22050 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
22060 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
22070 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
22080 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  LE h;.  void *zC
22090 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
220a0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
220b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
220c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
220d0 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  fs);.  if( zConv
220e0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
220f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
22100 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69  if( isNT() ){.#i
22110 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
22120 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
22130 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
22140 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
22150 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
22160 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
22170 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
22180 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
22190 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
221a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
221b0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
221c0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
221d0 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
221e0 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
221f0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
22200 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22210 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
22220 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
22230 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
22240 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
22250 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
22260 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
22270 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
22280 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
22290 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
222a0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
222b0 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
222c0 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
222d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
222e0 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
222f0 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
22300 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
22310 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
22320 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
22330 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64  oid))osGetProcAd
22340 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
22350 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  H, zSym);.}.stat
22360 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
22370 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
22380 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
22390 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
223a0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
223b0 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
223c0 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
223d0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
223e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
223f0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
22400 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
22410 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
22420 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
22430 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
22440 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
22450 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
22460 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
22470 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
22480 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
22490 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
224a0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
224b0 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
224c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
224d0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
224e0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
224f0 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
22500 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
22510 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
22520 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
22530 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
22540 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
22550 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
22560 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
22570 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
22580 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
22590 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
225a0 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &x);.    memcpy(
225b0 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69  &zBuf[n], &x, si
225c0 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20  zeof(x));.    n 
225d0 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20  += sizeof(x);.  
225e0 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
225f0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
22600 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
22610 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22620 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
22630 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
22640 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
22650 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
22660 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66  of(pid);.  }.#if
22670 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
22680 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c  .  if( sizeof(UL
22690 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e  ONGLONG)<=nBuf-n
226a0 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e   ){.    ULONGLON
226b0 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
226c0 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
226d0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
226e0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
226f0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
22700 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
22710 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
22720 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
22730 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
22740 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
22750 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
22760 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
22770 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
22780 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
22790 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
227a0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
227b0 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
227c0 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
227d0 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
227e0 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
227f0 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
22800 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
22810 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
22820 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
22830 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
22840 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
22850 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
22860 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
22870 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
22880 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
22890 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
228a0 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
228b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
228c0 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
228d0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
228e0 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  eep((microsec+99
228f0 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53  9)/1000);.  UNUS
22900 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
22910 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d  s);.  return ((m
22920 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
22930 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  0)*1000;.}../*.*
22940 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22950 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
22960 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
22970 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
22980 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
22990 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
229a0 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
229b0 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
229c0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
229d0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
229e0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
229f0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
22a00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
22a10 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
22a20 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
22a30 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
22a40 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
22a50 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
22a60 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
22a70 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
22a80 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
22a90 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
22aa0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
22ab0 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
22ac0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
22ad0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
22ae0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
22af0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
22b00 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
22b10 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
22b20 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
22b30 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
22b40 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
22b50 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
22b60 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
22b70 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
22b80 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
22b90 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
22ba0 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
22bb0 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
22bc0 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
22bd0 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
22be0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
22bf0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
22c00 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
22c10 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
22c20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
22c30 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
22c40 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
22c50 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
22c60 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
22c70 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
22c80 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
22c90 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
22ca0 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30  ber of .     100
22cb0 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
22cc0 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
22cd0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
22ce0 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20  D 2305813.5). . 
22cf0 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
22d00 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
22d10 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
22d20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
22d30 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
22d40 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
22d50 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
22d60 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
22d70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
22d80 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
22d90 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
22da0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
22db0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
22dc0 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
22dd0 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
22de0 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
22df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
22e00 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
22e10 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20  BitValue = .    
22e20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
22e30 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
22e40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
22e50 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20  0000000 +.      
22e60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
22e70 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53  94967296;..#if S
22e80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
22e90 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
22ea0 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ;.  osGetSystemT
22eb0 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
22ec0 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
22ed0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
22ee0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
22ef0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53  o. */.  if (!osS
22f00 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
22f10 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
22f20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22f30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
22f40 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
22f50 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
22f60 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
22f70 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
22f80 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
22f90 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
22fa0 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
22fb0 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
22fc0 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20  ax32BitValue) + 
22fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22fe0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
22ff0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
23000 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
23010 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
23020 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
23030 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
23040 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
23050 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
23060 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
23070 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
23080 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
23090 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
230a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
230b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
230c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
230d0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
230e0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
230f0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
23100 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
23110 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
23120 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
23130 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
23140 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
23150 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
23160 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
23170 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
23180 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
23190 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
231a0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
231b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
231c0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
231d0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
231e0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
231f0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
23200 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
23210 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
23220 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
23230 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
23240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23250 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
23260 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
23270 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
23280 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
23290 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
232a0 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
232b0 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
232c0 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
232d0 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
232e0 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
232f0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
23300 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
23310 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
23320 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
23330 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
23340 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
23350 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
23360 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
23370 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
23380 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
23390 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
233a0 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
233b0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
233c0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
233d0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
233e0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
233f0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
23400 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
23410 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
23420 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
23430 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
23440 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
23450 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
23460 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
23470 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
23480 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
23490 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
234a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
234b0 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
234c0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
234d0 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
234e0 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
234f0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
23500 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
23510 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
23520 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
23530 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
23540 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
23550 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
23560 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
23570 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
23580 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
23590 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
235a0 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
235b0 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
235c0 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
235d0 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
235e0 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
235f0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
23600 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
23610 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
23620 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
23630 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
23640 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
23650 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
23660 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
23670 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
23680 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
23690 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
236a0 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
236b0 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
236c0 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
236d0 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
236e0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
236f0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
23700 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
23710 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
23720 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
23730 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
23740 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
23750 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
23760 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
23770 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
23780 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
23790 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
237a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
237b0 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45   return getLastE
237c0 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73  rrorMsg(osGetLas
237d0 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20  tError(), nBuf, 
237e0 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zBuf);.}../*.** 
237f0 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
23800 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
23810 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
23820 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69   interface..*/.i
23830 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
23840 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  it(void){.  stat
23850 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
23860 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  inVfs = {.    3,
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
23890 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
238a0 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
238b0 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41  OsFile */.    MA
238c0 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20 20  X_PATH,         
238d0 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
238e0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23900 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
23910 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  n32",           
23920 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
23930 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
23940 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
23950 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
23960 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
23970 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
23980 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
23990 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
239a0 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
239b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
239c0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
239d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
239e0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
239f0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
23a00 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
23a10 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
23a20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
23a30 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
23a40 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
23a50 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
23a60 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
23a70 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
23a80 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
23a90 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
23aa0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
23ab0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
23ac0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
23ad0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
23ae0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
23af0 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
23b00 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
23b10 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
23b20 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
23b30 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
23b40 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
23b50 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
23b60 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
23b70 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
23b80 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
23b90 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
23ba0 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
23bb0 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
23bc0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
23bd0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
23be0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
23bf0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  mCall */.  };.. 
23c00 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
23c10 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
23c20 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
23c30 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
23c40 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
23c50 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
23c60 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
23c70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
23c80 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
23c90 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==74 );..  /* ge
23ca0 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
23cb0 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
23cc0 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
23cd0 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
23ce0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
23cf0 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
23d00 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
23d10 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
23d20 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
23d30 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
23d40 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
23d50 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
23d60 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
23d70 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
23d80 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
23d90 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
23da0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
23db0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
23dc0 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
23dd0 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  Vfs, 1);.  retur
23de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
23df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
23e00 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
23e10 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
23e20 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
23e30 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
23e40 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
23e50 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
23e60 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
23e70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
23e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
23e90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
23ea0 57 49 4e 20 2a 2f 0a                             WIN */.