/ Hex Artifact Content
Login

Artifact aead0182637b77f6b86e2326ee6bce9b1add0637:


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 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
0a50: 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
0a60: 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
0a70: 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
0a80: 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  f INVALID_FILE_A
0a90: 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66 69  TTRIBUTES.# defi
0aa0: 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ne INVALID_FILE_
0ab0: 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57 4f  ATTRIBUTES ((DWO
0ac0: 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a  RD)-1) .#endif..
0ad0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
0ae0: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
0af0: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
0b00: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
0b10: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
0b20: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
0b30: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
0b40: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
0b50: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
0b60: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
0b70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0b80: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
0b90: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0ba0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0bb0: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0bc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0bd0: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0be0: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0bf0: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
0c00: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
0c10: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
0c20: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
0c30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
0c40: 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61  * WinCE lacks na
0c50: 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72  tive support for
0c60: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f   file locking so
0c70: 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65   we have to fake
0c80: 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65   it.** with some
0c90: 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e   code of our own
0ca0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0cb0: 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66  OS_WINCE.typedef
0cc0: 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63   struct winceLoc
0cd0: 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65  k {.  int nReade
0ce0: 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  rs;       /* Num
0cf0: 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f  ber of reader lo
0d00: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  cks obtained */.
0d10: 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b    BOOL bPending;
0d20: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74        /* Indicat
0d30: 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  es a pending loc
0d40: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
0d50: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  ned */.  BOOL bR
0d60: 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20  eserved;     /* 
0d70: 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65  Indicates a rese
0d80: 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65  rved lock has be
0d90: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
0da0: 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65   BOOL bExclusive
0db0: 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  ;    /* Indicate
0dc0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
0dd0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0de0: 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65  ained */.} wince
0df0: 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Lock;.#endif../*
0e00: 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20  .** The winFile 
0e10: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73  structure is a s
0e20: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
0e30: 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69  e3_file* specifi
0e40: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
0e50: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
0e60: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0e70: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
0e80: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
0e90: 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74  inFile {.  const
0ea0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
0eb0: 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a  ods *pMethod; /*
0ec0: 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  ** Must be first
0ed0: 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   ***/.  sqlite3_
0ee0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
0ef0: 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20  /* The VFS used 
0f00: 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  to open this fil
0f10: 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e */.  HANDLE h;
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f30: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
0f40: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
0f50: 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65  */.  u8 locktype
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
0f80: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
0f90: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
0fa0: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
0fb0: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
0fc0: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
0fd0: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
0fe0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c  ock */.  u8 ctrl
0ff0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1000: 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20   /* Flags.  See 
1010: 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20  WINFILE_* below 
1020: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
1030: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  rrno;        /* 
1040: 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1050: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1060: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66  I/O error */.#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70  _WAL.  winShm *p
1090: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
10a0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
10b0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
10c0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  his file */.#end
10d0: 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  if.  const char 
10e0: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20  *zPath;      /* 
10f0: 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  Full pathname of
1100: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1110: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
1120: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b          /* Chunk
1130: 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64   size configured
1140: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1150: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1160: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50  TE_OS_WINCE.  LP
1170: 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c  WSTR zDeleteOnCl
1180: 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ose;  /* Name of
1190: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
11a0: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
11b0: 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b    HANDLE hMutex;
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
11d0: 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  ex used to contr
11e0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61  ol access to sha
11f0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20  red lock */  .  
1200: 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20  HANDLE hShared; 
1210: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1220: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1230: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1240: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  g */.  winceLock
1250: 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f   local;        /
1260: 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  * Locks obtained
1270: 20 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63   by this instanc
1280: 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a  e of winFile */.
1290: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61    winceLock *sha
12a0: 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f  red;      /* Glo
12b0: 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  bal shared lock 
12c0: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66  memory for the f
12d0: 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  ile  */.#endif.#
12e0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12f0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1300: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1320: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
1330: 6e 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ng xFetch refere
1340: 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  nces */.  HANDLE
1350: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
1360: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1370: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
1380: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a  memory mapping *
1390: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
13a0: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
13b0: 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79    /* Area memory
13c0: 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c   mapped */.  sql
13d0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
13e0: 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  ize;       /* Us
13f0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70  able size of map
1400: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
1410: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1420: 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a  apSizeActual; /*
1430: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
1440: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
1450: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1460: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
1470: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46   /* Configured F
1480: 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76  CNTL_MMAP_SIZE v
1490: 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
14a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
14b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
14c0: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
14d0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
14e0: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20  _RDONLY         
14f0: 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65   0x02   /* Conne
1500: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
1510: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ly */.#define WI
1520: 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
1530: 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20  L     0x04   /* 
1540: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
1550: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ode */.#define W
1560: 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  INFILE_PSOW     
1570: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a         0x10   /*
1580: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1590: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
15a0: 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  E */../*. * The 
15b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
15c0: 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  er used by sqlit
15d0: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
15e0: 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e  ebug().. */.#ifn
15f0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1600: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20  _DBG_BUF_SIZE.# 
1610: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1620: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
1630: 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d  E   ((int)(4096-
1640: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a  sizeof(DWORD))).
1650: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
1660: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
1670: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
1680: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
1690: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
16a0: 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65   * the data dire
16b0: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
16c0: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
16d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
16e0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
16f0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
1700: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1710: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1720: 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (1).#endif../*.
1730: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
1740: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
1750: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1760: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
1770: 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70  that. * the temp
1780: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
1790: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
17a0: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
17b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
17c0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
17d0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
17e0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
17f0: 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23  CTORY_TYPE (2).#
1800: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
1810: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
1820: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1830: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
1840: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
1850: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
1860: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
1870: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
1880: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
1890: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
18a0: 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74  LLOC../*. * If t
18b0: 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  his is non-zero,
18c0: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
18d0: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
18e0: 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20  d by the native 
18f0: 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74  Win32. * allocat
1900: 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74  or subsystem; ot
1910: 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66  herwise, the def
1920: 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61  ault process hea
1930: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20  p will be used. 
1940: 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67   This. * setting
1950: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77   has no effect w
1960: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  hen compiling fo
1970: 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66  r WinRT.  By def
1980: 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e  ault, this is en
1990: 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20  abled. * and an 
19a0: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
19b0: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
19c0: 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63   store all alloc
19d0: 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ated data.. *. *
19e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a  *************. *
1a30: 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20   WARNING: It is 
1a40: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
1a50: 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
1a60: 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d   setting is non-
1a70: 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20  zero and the. * 
1a80: 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53           winMemS
1a90: 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
1aa0: 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e   is called (e.g.
1ab0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
1ac0: 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20  shutdown. *     
1ad0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20       function), 
1ae0: 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61  all data that wa
1af0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
1b00: 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68  g the isolated h
1b10: 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  eap will. *     
1b20: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d       be freed im
1b30: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e  mediately and an
1b40: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63  y attempt to acc
1b50: 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20  ess any of that 
1b60: 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20  freed. *        
1b70: 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f    data will almo
1b80: 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73  st certainly res
1b90: 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69  ult in an immedi
1ba0: 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61  ate access viola
1bb0: 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.. *********
1bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  *****. */.#ifnde
1c10: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1c20: 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65  EAP_CREATE.#  de
1c30: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1c40: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20  2_HEAP_CREATE   
1c50: 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a   (TRUE).#endif..
1c60: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
1c70: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
1c80: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
1c90: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
1ca0: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
1cb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1cc0: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
1cd0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
1ce0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
1cf0: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
1d00: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
1d10: 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20  _SIZE) * \.     
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c    (SQLITE_DEFAUL
1d50: 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34  T_PAGE_SIZE) + 4
1d60: 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a  194304).#endif..
1d70: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
1d80: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
1d90: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
1da0: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
1db0: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
1dc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1dd0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1de0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
1df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
1e00: 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e  AX_SIZE  (0).#en
1e10: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65  dif../*. * The e
1e20: 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73  xtra flags to us
1e30: 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68  e in calls to th
1e40: 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49  e Win32 heap API
1e50: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  s.  This value m
1e60: 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f  ay be. * zero fo
1e70: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65  r the default be
1e80: 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e  havior.. */.#ifn
1e90: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1ea0: 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64  _HEAP_FLAGS.#  d
1eb0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
1ec0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20  32_HEAP_FLAGS   
1ed0: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f    (0).#endif.../
1ee0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44  *.** The winMemD
1ef0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74  ata structure st
1f00: 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ores information
1f10: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1f20: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a   Win32-specific.
1f30: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
1f40: 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74  ethods implement
1f50: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
1f60: 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  f struct winMemD
1f70: 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a  ata winMemData;.
1f80: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
1f90: 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  a {.#ifndef NDEB
1fa0: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 3b 20  UG.  u32 magic; 
1fb0: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
1fc0: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
1fd0: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
1fe0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48  n. */.#endif.  H
1ff0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20  ANDLE hHeap; /* 
2000: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75  The handle to ou
2010: 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f  r heap. */.  BOO
2020: 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f  L bOwned;  /* Do
2030: 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70   we own the heap
2040: 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69   (i.e. destroy i
2050: 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20  t on shutdown)? 
2060: 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  */.};..#ifndef N
2070: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49  DEBUG.#define WI
2080: 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20 20 30  NMEM_MAGIC     0
2090: 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64 69 66  x42b2830b.#endif
20a0: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
20b0: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d  winMemData win_m
20c0: 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e  em_data = {.#ifn
20d0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e  def NDEBUG.  WIN
20e0: 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69  MEM_MAGIC,.#endi
20f0: 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a  f.  NULL, FALSE.
2100: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
2110: 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  UG.#define winMe
2120: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 61  mAssertMagic() a
2130: 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64  ssert( win_mem_d
2140: 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45  ata.magic==WINME
2150: 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73 65 0a  M_MAGIC ).#else.
2160: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2170: 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64  sertMagic().#end
2180: 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  if..#define winM
2190: 65 6d 47 65 74 48 65 61 70 28 29 20 77 69 6e 5f  emGetHeap() win_
21a0: 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a  mem_data.hHeap..
21b0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
21c0: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
21d0: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f  ytes);.static vo
21e0: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
21f0: 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61  id *pPrior);.sta
2200: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
2210: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
2220: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
2230: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
2240: 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70  nMemSize(void *p
2250: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
2260: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
2270: 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  n);.static int w
2280: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
2290: 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69  pAppData);.stati
22a0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75  c void winMemShu
22b0: 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70  tdown(void *pApp
22c0: 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71  Data);..const sq
22d0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
22e0: 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  s *sqlite3MemGet
22f0: 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e  Win32(void);.#en
2300: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
2310: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
2320: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2330: 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28  ng variable is (
2340: 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e  normally) set on
2350: 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61  ce and never cha
2360: 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74  nges.** thereaft
2370: 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20  er.  It records 
2380: 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72  whether the oper
2390: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
23a0: 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e  Win9x.** or WinN
23b0: 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70  T..**.** 0:   Op
23c0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75  erating system u
23d0: 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20  nknown..** 1:   
23e0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
23f0: 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a   is Win9x..** 2:
2400: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
2410: 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a  tem is WinNT..**
2420: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  .** In order to 
2430: 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69  facilitate testi
2440: 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79  ng on a WinNT sy
2450: 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66  stem, the test f
2460: 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61  ixture.** can ma
2470: 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20  nually set this 
2480: 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d  value to 1 to em
2490: 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61  ulate Win98 beha
24a0: 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  vior..*/.#ifdef 
24b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
24c0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
24d0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
24e0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  c int sqlite3_os
24f0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69  _type = 0;.#endi
2500: 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41  f..#ifndef SYSCA
2510: 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53  LL.#  define SYS
2520: 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73  CALL sqlite3_sys
2530: 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a  call_ptr.#endif.
2540: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2550: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69  tion is not avai
2560: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
2570: 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a   CE or WinRT.. *
2580: 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  /..#if SQLITE_OS
2590: 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
25a0: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
25b0: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
25c0: 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a  sANSI()       1.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
25e0: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
25f0: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
2600: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
2610: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
2620: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
2630: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
2640: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
2650: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
2660: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
2670: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
2680: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
2690: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
26a0: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
26b0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
26c0: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
26d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
26e0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
26f0: 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  in_syscall {.  c
2700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2720: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74  Name of the syst
2730: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2740: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2750: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
2760: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
2770: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2780: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2790: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
27a0: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
27b0: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
27c0: 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49  [] = {.#if !SQLI
27d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
27e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
27f0: 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73    { "AreFileApis
2800: 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28  ANSI",         (
2810: 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41  SYSCALL)AreFileA
2820: 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20  pisANSI,        
2830: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2840: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
2850: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
2860: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2880: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
2890: 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  f osAreFileApisA
28a0: 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72  NSI.#define osAr
28b0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28  eFileApisANSI ((
28c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f  BOOL(WINAPI*)(VO
28d0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  ID))aSyscall[0].
28e0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
28f0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2900: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
2910: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2920: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
2930: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
2940: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2950: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
2960: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2970: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
2980: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
2990: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
29c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
29d0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
29e0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
29f0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
2a00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
2a10: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
2a20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2a30: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2a40: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2a60: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
2a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
2a80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2a90: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
2aa0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2ab0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2ac0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2ad0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2ae0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
2af0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
2b00: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
2b10: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
2b20: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2b40: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
2b50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
2b60: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
2b70: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
2b80: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
2b90: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
2ba0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2bb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2bc0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
2bd0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2bf0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
2c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
2c10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
2c20: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
2c30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2c40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2c50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2c60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2c70: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
2c80: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2c90: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
2ca0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
2cb0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
2cc0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
2cd0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
2ce0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
2cf0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
2d00: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
2d10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2d20: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2d30: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
2d40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2d50: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
2d60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2d70: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2d80: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2d90: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2dc0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2dd0: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
2de0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
2df0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
2e00: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
2e10: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
2e20: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
2e30: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2e40: 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c  rent)..#if (!SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2e70: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
2e80: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
2e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ea0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
2eb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
2ec0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2ee0: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
2ef0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2f00: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
2f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2f40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2f50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28  eFileMappingA ((
2f60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2f70: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
2f80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
2f90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
2fa0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  ORD,DWORD,LPCSTR
2fb0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2fc0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2fd0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
2fe0: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
2ff0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3000: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3010: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
3020: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3030: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3040: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3050: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3060: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3070: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3080: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3090: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
30a0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
30b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
30c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
30d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
30e0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
30f0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3100: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3110: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3120: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
3130: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
3140: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3150: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
3160: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3170: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3180: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3190: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
31a0: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
31b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
31c0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
31d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
31e0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
31f0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
3200: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3230: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3240: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
3250: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
3260: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
3270: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
3280: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3290: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
32a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
32b0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
32c0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
32d0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
32e0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
32f0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
3300: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3310: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3330: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3350: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3360: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
3370: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
3380: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
3390: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
33a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
33b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
33c0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
33d0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
33e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
33f0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3410: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
3420: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3430: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3460: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
3470: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
3480: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
3490: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
34a0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
34b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
34c0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
34d0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
34e0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
34f0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
3500: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
3510: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3520: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3550: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
3560: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
3570: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
3580: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
3590: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
35a0: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
35b0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
35c0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
35d0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
35e0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
35f0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
3600: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
3610: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
3620: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
3630: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
3640: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3670: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
3680: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
3690: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
36a0: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
36b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
36c0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
36d0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
36e0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
36f0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
3700: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
3710: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
3720: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
3730: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
3740: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
3750: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
3760: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3770: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3780: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3790: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
37a0: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
37b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
37c0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
37d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
37e0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
37f0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
3800: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3830: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
3840: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
3850: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
3860: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
3870: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
3880: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
3890: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
38a0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
38b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
38c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
38d0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
38e0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
38f0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
3900: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
3910: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3920: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
3930: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
3940: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3960: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3970: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
3980: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
3990: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
39a0: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
39b0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
39c0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
39d0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
39e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
39f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3a00: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
3a10: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
3a20: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
3a30: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
3a40: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
3a50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3a60: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3aa0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3ab0: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
3ac0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
3ad0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
3ae0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
3af0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
3b00: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
3b10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
3b20: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
3b30: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3b40: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
3b50: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
3b60: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
3b70: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3b80: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3b90: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
3ba0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3bb0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3bc0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
3bd0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
3be0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
3bf0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
3c00: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3c10: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3c20: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
3c30: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3c60: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
3c70: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
3c80: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
3c90: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
3ca0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3cb0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
3cc0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
3cd0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3ce0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3cf0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3d00: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3d10: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
3d20: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
3d30: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
3d40: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
3d50: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
3d60: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
3d70: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
3d80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3db0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3dc0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
3dd0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3de0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
3df0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
3e00: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
3e10: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
3e20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3e30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3e40: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3e50: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3e60: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
3e70: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
3e80: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
3e90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3ea0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3eb0: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
3ec0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ee0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3ef0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3f00: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
3f10: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
3f20: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
3f30: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3f40: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3f50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3f60: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3f70: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
3f80: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
3f90: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
3fa0: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
3fb0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3fc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3fd0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
3fe0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3ff0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4000: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4010: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4020: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4030: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4040: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4050: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4060: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4070: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4080: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4090: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
40a0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
40b0: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
40c0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
40d0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
40e0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4110: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4120: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4130: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
4140: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
4150: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
4160: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
4170: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
4180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4190: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
41a0: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
41b0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
41d0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
4250: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
4260: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
4270: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
4280: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4290: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
42a0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
42b0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
42c0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
42d0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
42e0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
42f0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
4300: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4310: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
4320: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
4330: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4350: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4360: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
4370: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
4380: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
4390: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
43a0: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
43b0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
43c0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
43d0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
43e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
43f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4400: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4410: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
4420: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
4430: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
4440: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
4450: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4460: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4470: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
4480: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
44a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
44b0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
44c0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
44d0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
44e0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
44f0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
4500: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
4510: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4520: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
4530: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4540: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
4550: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4560: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
4570: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
4580: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
4590: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
45a0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
45b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
45c0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
45d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
45e0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
45f0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
4600: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
4610: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
4620: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
4630: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
4640: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4650: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
4660: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
4670: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
4680: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
4690: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
46a0: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
46b0: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
46c0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
46d0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
46e0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
46f0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
4700: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
4710: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
4720: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
4730: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
4740: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
4750: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
4760: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4790: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
47a0: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
47b0: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
47c0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
47d0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
47e0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
47f0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4800: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
4810: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
4820: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4830: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
4840: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4850: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
4860: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
4870: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
48a0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
48b0: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
48c0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
48d0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
48e0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
48f0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
4900: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
4910: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
4920: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
4930: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4940: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
4950: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
4960: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
4970: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
4980: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4990: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
49a0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
49b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
49c0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
49d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
49e0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
49f0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4a00: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4a30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4a40: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
4a50: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
4a60: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
4a70: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4a80: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
4a90: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4aa0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4ab0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
4ac0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
4ad0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4ae0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
4af0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4b00: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
4b10: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
4b20: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4b50: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
4b60: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
4b70: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
4b80: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
4b90: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4bb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4bc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4bd0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
4be0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
4bf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4c00: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
4c10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4c20: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
4c30: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
4c40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4c70: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
4c80: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
4c90: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
4ca0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
4cb0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4cc0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4cd0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
4ce0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
4cf0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
4d00: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
4d10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4d20: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
4d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4d40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4d60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4d70: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
4d80: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
4d90: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
4da0: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
4db0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
4dc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4dd0: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72  NSI).  { "GetVer
4de0: 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20  sionExA",       
4df0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4e00: 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20  VersionExA,     
4e10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4e20: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
4e30: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
4e40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4e70: 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73  define osGetVers
4e80: 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49  ionExA ((BOOL(WI
4e90: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
4ea0: 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46    LPOSVERSIONINF
4eb0: 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d  OA))aSyscall[34]
4ec0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4ed0: 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20  "HeapAlloc",    
4ee0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ef0: 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20  ALL)HeapAlloc,  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f10: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4f20: 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  pAlloc ((LPVOID(
4f30: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4f40: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4f50: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
4f60: 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[35].pCurrent).
4f70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4f80: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43  WINRT.  { "HeapC
4f90: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
4fa0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
4fb0: 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  apCreate,       
4fc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4fd0: 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  e.  { "HeapCreat
4fe0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4ff0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5020: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72  #define osHeapCr
5030: 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49  eate ((HANDLE(WI
5040: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a  NAPI*)(DWORD,SIZ
5050: 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  E_T, \.        S
5060: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
5070: 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  36].pCurrent)..#
5080: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5090: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73  NRT.  { "HeapDes
50a0: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
50b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
50c0: 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20  Destroy,        
50d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
50e0: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
50f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
5100: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5130: 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74  efine osHeapDest
5140: 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  roy ((BOOL(WINAP
5150: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
5160: 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e  call[37].pCurren
5170: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65  t)..  { "HeapFre
5180: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5190: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
51a0: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
51b0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
51c0: 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28  ne osHeapFree ((
51d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
51e0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
51f0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  D))aSyscall[38].
5200: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5210: 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20  HeapReAlloc",   
5220: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5230: 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20  LL)HeapReAlloc, 
5240: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5250: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5260: 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  ReAlloc ((LPVOID
5270: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5280: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c  ,DWORD,LPVOID, \
5290: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
52a0: 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43  )aSyscall[39].pC
52b0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
52c0: 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20  apSize",        
52d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
52e0: 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20  )HeapSize,      
52f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5300: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69  #define osHeapSi
5310: 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41  ze ((SIZE_T(WINA
5320: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5330: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
5340: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
5350: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
5360: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5370: 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  RT.  { "HeapVali
5380: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
5390: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56    (SYSCALL)HeapV
53a0: 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20  alidate,        
53b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
53c0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
53d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
53e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5410: 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64  fine osHeapValid
5420: 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ate ((BOOL(WINAP
5430: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5440: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
5450: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31  OID))aSyscall[41
5460: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5470: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5480: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
5490: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
54a0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
54b0: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
54c0: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
54d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
54e0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20  LoadLibraryA,   
54f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5500: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
5510: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
5520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
5560: 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55  LibraryA ((HMODU
5570: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
5580: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d  TR))aSyscall[42]
5590: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
55a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
55b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
55c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
55d0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
55e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
55f0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
5600: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
5610: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
5620: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
5630: 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20  dLibraryW,      
5640: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5650: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
5660: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
5670: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
56a0: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
56b0: 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28  raryW ((HMODULE(
56c0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
56d0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70  ))aSyscall[43].p
56e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
56f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5700: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5720: 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65  YSCALL)LocalFree
5730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5740: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5750: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
5760: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5770: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5780: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5790: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
57a0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
57b0: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
57c0: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
57d0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
57e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
57f0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5800: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
5810: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
5820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5830: 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  LockFile,       
5840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5850: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
5860: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
58a0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
58b0: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c  File.#define osL
58c0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
58d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
58e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
58f0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5900: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e  D))aSyscall[45].
5910: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
5920: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5930: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
5940: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
5950: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5960: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
5970: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5980: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
5990: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
59a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
59d0: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
59e0: 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73  ileEx.#define os
59f0: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
5a00: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5a10: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
5a20: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
5a30: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
5a40: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  D))aSyscall[46].
5a50: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
5a60: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5a70: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
5a80: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
5a90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5aa0: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61  IT_WAL)).  { "Ma
5ab0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
5ac0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ad0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
5ae0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5af0: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
5b00: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
5b10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5b40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
5b50: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
5b60: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5b70: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
5b80: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5b90: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5ba0: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
5bb0: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
5bc0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
5bd0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
5be0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
5bf0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5c00: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
5c10: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
5c20: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
5c30: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
5c40: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
5c50: 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70  ))aSyscall[48].p
5c60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
5c70: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
5c80: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
5c90: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
5ca0: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
5cb0: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
5cc0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5cd0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
5ce0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
5cf0: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
5d00: 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72  yscall[49].pCurr
5d10: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
5d20: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5d30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
5d40: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
5d50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5d60: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
5d70: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5d80: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
5d90: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
5da0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
5db0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  PED))aSyscall[50
5dc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5dd0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5df0: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
5e00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
5e10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
5e20: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
5e30: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5e40: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e  E))aSyscall[51].
5e50: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5e60: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5e70: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
5e80: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
5e90: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
5ea0: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
5eb0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5ec0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
5ed0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5ee0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5f00: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5f10: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
5f20: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
5f30: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
5f40: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
5f50: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
5f60: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
5f70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f80: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
5f90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
5fb0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
5fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5fd0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6020: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
6030: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
6040: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
6050: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
6060: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
6070: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
6080: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
6090: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
60a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
60b0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
60c0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
60d0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
60e0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
60f0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
6100: 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65  scall[54].pCurre
6110: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6120: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6130: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6140: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6160: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
6170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6180: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
6190: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
61a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
61b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
61c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
61d0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
61e0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
61f0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
6200: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6210: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6220: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
6230: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
6240: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
6250: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
6260: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
6270: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
6280: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
6290: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
62a0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
62b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
62c0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
62e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6300: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6310: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
6320: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6330: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6340: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
6350: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
6360: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d  ED))aSyscall[56]
6370: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6380: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6390: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
63a0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
63b0: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
63c0: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
63d0: 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66  CALL)UnmapViewOf
63e0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20  File,         0 
63f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
6400: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
6410: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6420: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6430: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6440: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6450: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
6460: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6470: 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61  (LPCVOID))aSysca
6480: 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[57].pCurrent)
6490: 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54  ..  { "WideCharT
64a0: 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20  oMultiByte",    
64b0: 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68   (SYSCALL)WideCh
64c0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20  arToMultiByte,  
64d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
64e0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
64f0: 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e  tiByte ((int(WIN
6500: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
6510: 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53  ,LPCWSTR,int,LPS
6520: 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20  TR,int, \.      
6530: 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29    LPCSTR,LPBOOL)
6540: 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43  )aSyscall[58].pC
6550: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72  urrent)..  { "Wr
6560: 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20  iteFile",       
6570: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6580: 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20  )WriteFile,     
6590: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
65a0: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46  #define osWriteF
65b0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
65c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f  I*)(HANDLE,LPCVO
65d0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
65e0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
65f0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6600: 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[59].pCurrent)
6610: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6620: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
6630: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
6640: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
6650: 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20  eateEventExW,   
6660: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6670: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  e.  { "CreateEve
6680: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
6690: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
66c0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
66d0: 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c  EventExW ((HANDL
66e0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
66f0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
6700: 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  ,LPCWSTR, \.    
6710: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29      DWORD,DWORD)
6720: 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43  )aSyscall[60].pC
6730: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6740: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6750: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
6760: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
6770: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
6780: 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30  gleObject,     0
6790: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
67a0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
67b0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
67c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
67d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
67e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
67f0: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
6800: 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49  bject ((DWORD(WI
6810: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
6820: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
6830: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
6840: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6850: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6860: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
6870: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
6880: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
6890: 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d  eObjectEx,   0 }
68a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69  ,.#else.  { "Wai
68b0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
68c0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
68d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
68e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
68f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6900: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6910: 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49  ectEx ((DWORD(WI
6920: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6930: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42  ORD, \.        B
6940: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 32  OOL))aSyscall[62
6950: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6960: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6970: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
6980: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
6990: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
69a0: 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20  PointerEx,      
69b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
69c0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
69d0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
69e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6a00: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6a10: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
6a20: 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  terEx ((BOOL(WIN
6a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52  API*)(HANDLE,LAR
6a40: 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20  GE_INTEGER, \.  
6a50: 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54        PLARGE_INT
6a60: 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73  EGER,DWORD))aSys
6a70: 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e  call[63].pCurren
6a80: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6a90: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
6aa0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
6ab0: 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53  yHandleEx", (SYS
6ac0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f  CALL)GetFileInfo
6ad0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
6ae0: 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  x, 0 },.#else.  
6af0: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
6b00: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
6b10: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6b30: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6b40: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  ine osGetFileInf
6b50: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6b60: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
6b70: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
6b80: 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42       FILE_INFO_B
6b90: 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c  Y_HANDLE_CLASS,L
6ba0: 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79  PVOID,DWORD))aSy
6bb0: 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65  scall[64].pCurre
6bc0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6bd0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
6be0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6bf0: 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69  _WAL).  { "MapVi
6c00: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
6c10: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
6c20: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
6c30: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
6c40: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
6c50: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
6c60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6c90: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
6ca0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
6cb0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6cc0: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
6cd0: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
6ce0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6cf0: 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[65].pCurrent).
6d00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6d10: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
6d20: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
6d30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
6d40: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
6d50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6d60: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
6d70: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
6d80: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6db0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
6dc0: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
6dd0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
6de0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6df0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
6e00: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
6e10: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
6e20: 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72  Syscall[66].pCur
6e30: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
6e40: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
6e50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6e60: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
6e70: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
6e80: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
6e90: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
6ea0: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
6eb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6ec0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
6ed0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
6ee0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6f10: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
6f20: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
6f30: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
6f40: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
6f50: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
6f60: 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [67].pCurrent)..
6f70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6f80: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
6f90: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
6fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
6fb0: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
6fc0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6fd0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
6fe0: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
6ff0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7020: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
7030: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
7040: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
7050: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
7060: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7070: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7080: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
7090: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
70a0: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
70b0: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
70c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
70d0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
70e0: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
70f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7100: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7110: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7120: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
7130: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
7140: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
7150: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
7160: 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75  aSyscall[69].pCu
7170: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
7180: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
7190: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
71a0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
71b0: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
71c0: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
71d0: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
71e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
71f0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
7200: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7220: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7230: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
7240: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7250: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
7260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
7270: 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[70].pCurrent)
7280: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
7290: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
72a0: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
72b0: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
72c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
72d0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
72e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
72f0: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7300: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
7310: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7340: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
7350: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
7360: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
7370: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 31  STR))aSyscall[71
7380: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7390: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
73a0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
73b0: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
73c0: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
73d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
73e0: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
73f0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
7400: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 32  OID))aSyscall[72
7410: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7420: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7430: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
7440: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
7450: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
7460: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
7470: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
7480: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
7490: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
74a0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
74b0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
74c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
74e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
74f0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
7500: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
7510: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
7520: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7530: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
7540: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
7550: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
7560: 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72  yscall[73].pCurr
7570: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
7580: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
7590: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
75a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
75b0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
75c0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
75d0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
75e0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
75f0: 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20  "win32" VFSes.  
7600: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7610: 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c   opon successful
7620: 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a  ly updating the.
7630: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70  ** system call p
7640: 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54  ointer, or SQLIT
7650: 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68  E_NOTFOUND if th
7660: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67  ere is no config
7670: 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d  urable.** system
7680: 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d   call named zNam
7690: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
76a0: 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
76b0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
76c0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
76d0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
76e0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
76f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7700: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
7710: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
7720: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
7730: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
7740: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7750: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
7760: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
7770: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
7780: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
7790: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
77a0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
77b0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
77c0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
77d0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
77e0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
77f0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
7800: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
7810: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
7820: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
7830: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
7840: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
7850: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7860: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
7870: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
7880: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
7890: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
78a0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
78b0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
78c0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
78d0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
78e0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
78f0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
7900: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
7910: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
7920: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
7930: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
7940: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
7950: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
7960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
7970: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
7980: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
7990: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
79a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
79b0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
79c0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
79d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
79e0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
79f0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
7a00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
7a10: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
7a20: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
7a30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
7a40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7a50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
7a60: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
7a70: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
7a80: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
7a90: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
7aa0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
7ab0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
7ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7ad0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7ae0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7af0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
7b00: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
7b10: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
7b20: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
7b30: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
7b40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
7b50: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
7b60: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
7b70: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
7b80: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
7b90: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
7ba0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
7bb0: 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65  _ptr winGetSyste
7bc0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
7bd0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
7be0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7bf0: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
7c00: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
7c10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
7c20: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
7c30: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
7c40: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
7c50: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
7c60: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7c70: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7c80: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
7c90: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
7ca0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
7cb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7cc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7cd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
7ce0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
7cf0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
7d00: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
7d10: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
7d20: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
7d30: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
7d40: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
7d50: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
7d60: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
7d70: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
7d80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
7d90: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
7da0: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
7db0: 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65  onst char *winNe
7dc0: 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c  xtSystemCall(sql
7dd0: 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e  ite3_vfs *p, con
7de0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
7df0: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a  .  int i = -1;..
7e00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7e10: 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61  ER(p);.  if( zNa
7e20: 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  me ){.    for(i=
7e30: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
7e40: 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29  Syscall)-1; i++)
7e50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
7e60: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
7e70: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
7e80: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7e90: 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c   }.  for(i++; i<
7ea0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
7eb0: 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ll); i++){.    i
7ec0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7ed0: 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74  Current!=0 ) ret
7ee0: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
7ef0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  zName;.  }.  ret
7f00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7f10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75  This function ou
7f20: 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66  tputs the specif
7f30: 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e  ied (ANSI) strin
7f40: 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64  g to the Win32 d
7f50: 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61  ebugger.** (if a
7f60: 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76  vailable)..*/..v
7f70: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
7f80: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f  2_write_debug(co
7f90: 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  nst char *zBuf, 
7fa0: 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61  int nBuf){.  cha
7fb0: 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45  r zDbgBuf[SQLITE
7fc0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
7fd0: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e  IZE];.  int nMin
7fe0: 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51   = MIN(nBuf, (SQ
7ff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
8000: 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f  UF_SIZE - 1)); /
8010: 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76  * may be negativ
8020: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e  e. */.  if( nMin
8030: 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b  <-1 ) nMin = -1;
8040: 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65   /* all negative
8050: 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d   values become -
8060: 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  1. */.  assert( 
8070: 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e  nMin==-1 || nMin
8080: 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49  ==0 || nMin<SQLI
8090: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
80a0: 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66  _SIZE );.#if def
80b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
80c0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
80d0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
80e0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
80f0: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8100: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
8110: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
8120: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
8130: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
8140: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
8150: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8160: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8170: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
8180: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
8190: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
81a0: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
81b0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
81c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
81d0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
81e0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
81f0: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
8200: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
8210: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
8220: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
8230: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
8240: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
8250: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
8260: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
8270: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
8280: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8290: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
82a0: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
82b0: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
82c0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
82d0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
82e0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
82f0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
8300: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
8310: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
8320: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
8330: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
8340: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
8350: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8360: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
8370: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
8380: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8390: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
83a0: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
83b0: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
83c0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
83d0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
83e0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
83f0: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
8400: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
8410: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8420: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
8430: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
8440: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
8450: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
8460: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
8470: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
8480: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
8490: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
84a0: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
84b0: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
84c0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
84d0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
84e0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e               SYN
8510: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
8520: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
8530: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
8540: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
8550: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
8560: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
8570: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
8580: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
8590: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  s);.#endif.}../*
85a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
85b0: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65  (non-zero) if we
85c0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64   are running und
85d0: 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c  er WinNT, Win2K,
85e0: 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69   WinXP,.** or Wi
85f0: 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nCE.  Return fal
8600: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
8610: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
8620: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
8630: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
8640: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
8650: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
8660: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
8670: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
8680: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
8690: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
86a0: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
86b0: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
86c0: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
86d0: 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75   call it when ru
86e0: 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d  nning Win95/98/M
86f0: 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a  E.  A call to.**
8700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8710: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
8720: 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ne if the host i
8730: 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72  s Win95/98/ME or
8740: 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20  .** WinNT/2K/XP 
8750: 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  so that we will 
8760: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
8770: 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c  not we can safel
8780: 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f  y call.** the Lo
8790: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a  ckFileEx() API..
87a0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
87b0: 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
87c0: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65 66 69  _OS_WINRT.# defi
87d0: 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23  ne isNT()  (1).#
87e0: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
87f0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8800: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 69 73  IDE).# define is
8810: 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a  NT()  (0).#else.
8820: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
8830: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
8840: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
8850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
8860: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
8870: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
8880: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
8890: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
88a0: 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56  o);.      osGetV
88b0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
88c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
88d0: 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f  _os_type = sInfo
88e0: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56  .dwPlatformId==V
88f0: 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33  ER_PLATFORM_WIN3
8900: 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20  2_NT ? 2 : 1;.  
8910: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
8920: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d  qlite3_os_type==
8930: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  2;.  }.#endif..#
8940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
8950: 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20  32_MALLOC./*.** 
8960: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20  Allocate nBytes 
8970: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  of memory..*/.st
8980: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
8990: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
89a0: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
89b0: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
89c0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
89d0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
89e0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
89f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8a00: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
8a10: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
8a20: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8a30: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8a40: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8a50: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8a60: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8a70: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
8a80: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
8a90: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8aa0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
8ab0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
8ac0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
8ad0: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
8ae0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
8af0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8b00: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
8b10: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
8b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8b30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
8b40: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
8b50: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29  oc %u bytes (%d)
8b60: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
8b80: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
8b90: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
8ba0: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
8bb0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n p;.}../*.** Fr
8bc0: 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ee memory..*/.st
8bd0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
8be0: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
8bf0: 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  r){.  HANDLE hHe
8c00: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
8c10: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
8c20: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
8c30: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
8c40: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
8c50: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
8c60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
8c70: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
8c80: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
8c90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8ca0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
8cb0: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
8cc0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
8cd0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8ce0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
8cf0: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
8d00: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
8d10: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
8d20: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
8d30: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
8d40: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
8d50: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
8d60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8d70: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
8d80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
8d90: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
8da0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
8db0: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ree block %p (%d
8dc0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
8de0: 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ior, osGetLastEr
8df0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
8e00: 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eap);.  }.}../*.
8e10: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
8e20: 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e  ze of an existin
8e30: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
8e40: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
8e50: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
8e60: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
8e70: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
8e80: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
8e90: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
8ea0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
8eb0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
8ec0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
8ed0: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
8ee0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
8ef0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
8f00: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
8f10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8f20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8f30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
8f40: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
8f50: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
8f60: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
8f70: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8f80: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
8f90: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
8fa0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
8fb0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
8fc0: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
8fd0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8fe0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8ff0: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
9000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
9010: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
9020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9040: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
9050: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
9060: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
9070: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9080: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9090: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
90a0: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
90c0: 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c  rior ? "HeapReAl
90d0: 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f  loc" : "HeapAllo
90e0: 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65  c", nBytes, osGe
90f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
9110: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
9120: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
9130: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9140: 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73   size of an outs
9150: 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69  tanding allocati
9160: 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f  on, in bytes..*/
9170: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
9180: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b  emSize(void *p){
9190: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
91a0: 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20  .  SIZE_T n;..  
91b0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
91c0: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
91d0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
91e0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
91f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9200: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
9210: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
9220: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9230: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
9240: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9250: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
9260: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
9270: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
9280: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9290: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
92a0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
92b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
92c0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
92d0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
92e0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
92f0: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
9300: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
9310: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9320: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
9330: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
9340: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
9350: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9360: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
9370: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
9380: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
9390: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
93a0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
93b0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
93c0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
93d0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
93e0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
93f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
9400: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
9410: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
9420: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
9430: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
9440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9450: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
9460: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
9470: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
9480: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
9490: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
94a0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
94b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
94c0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
94d0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
94e0: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
94f0: 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  IC );..#if !SQLI
9500: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
9510: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9520: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
9530: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9540: 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d  p ){.    pWinMem
9550: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
9560: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
9570: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9580: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
95b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
95c0: 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
95f0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
9600: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  AX_SIZE);.    if
9610: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
9620: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73  hHeap ){.      s
9630: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9640: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
9650: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65     "failed to He
9660: 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66  apCreate (%d), f
9670: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
9680: 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75  e=%u, maxSize=%u
9690: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47  ",.          osG
96a0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53  etLastError(), S
96b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
96c0: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
96d0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
96e0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53  EAP_INIT_SIZE, S
96f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9700: 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _MAX_SIZE);.    
9710: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9720: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
9730: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9740: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
9750: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
9760: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
9770: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
9780: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
9790: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
97a0: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
97b0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
97c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
97d0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
97e0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
97f0: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
9800: 70 20 28 25 64 29 22 2c 20 6f 73 47 65 74 4c 61  p (%d)", osGetLa
9810: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
9820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9830: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d  MEM;.  }.  pWinM
9840: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
9850: 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74   FALSE;.  assert
9860: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
9870: 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66  bOwned );.#endif
9880: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
9890: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30  emData->hHeap!=0
98a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
98b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
98c0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
98d0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
98e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
98f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9900: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
9910: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
9920: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
9930: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
9940: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9950: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
9960: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
9970: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69  ;.}../*.** Deini
9990: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
99a0: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ule..*/.static v
99b0: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
99c0: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
99d0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
99e0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
99f0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
9a00: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
9a10: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
9a20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e  turn;.  if( pWin
9a30: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
9a40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
9a50: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9a60: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9a70: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9a80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9a90: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9aa0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
9ab0: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
9ac0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
9ad0: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
9ae0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9af0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9b00: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
9b10: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
9b20: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
9b30: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
9b40: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
9b50: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
9b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
9b70: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9b80: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9b90: 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68 65  Destroy (%d), he
9ba0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
9bc0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
9bd0: 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61  oid*)pWinMemData
9be0: 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  ->hHeap);.      
9bf0: 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44  }.      pWinMemD
9c00: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
9c10: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  LSE;.    }.    p
9c20: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9c30: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  p = NULL;.  }.}.
9c40: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
9c50: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
9c60: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9c70: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
9c80: 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47  s in.** sqlite3G
9c90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69  lobalConfig.m wi
9ca0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
9cb0: 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  he routines in t
9cc0: 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a  his file. The.**
9cd0: 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69   arguments speci
9ce0: 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  fy the block of 
9cf0: 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65  memory to manage
9d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9d10: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
9d20: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  led by sqlite3_c
9d30: 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65  onfig(), and the
9d40: 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74  refore.** is not
9d50: 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
9d60: 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69  threadsafe (it i
9d70: 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74  s not)..*/.const
9d80: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
9d90: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
9da0: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a  GetWin32(void){.
9db0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
9dc0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
9dd0: 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  ds winMemMethods
9de0: 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d   = {.    winMemM
9df0: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
9e00: 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mFree,.    winMe
9e10: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  mRealloc,.    wi
9e20: 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69  nMemSize,.    wi
9e30: 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20  nMemRoundup,.   
9e40: 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20   winMemInit,.   
9e50: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c   winMemShutdown,
9e60: 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61  .    &win_mem_da
9e70: 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e  ta.  };.  return
9e80: 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b   &winMemMethods;
9e90: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
9ea0: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f  MemSetDefault(vo
9eb0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  id){.  sqlite3_c
9ec0: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
9ed0: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69  FIG_MALLOC, sqli
9ee0: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29  te3MemGetWin32()
9ef0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9f00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9f10: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OC */../*.** Con
9f20: 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72  vert a UTF-8 str
9f30: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
9f40: 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36   Unicode (UTF-16
9f50: 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ?). .**.** Space
9f60: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
9f70: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
9f80: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9f90: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
9fa0: 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e 69  LPWSTR utf8ToUni
9fb0: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
9fc0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
9fd0: 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53  nt nChar;.  LPWS
9fe0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
9ff0: 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d  ;..  nChar = osM
a000: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
a010: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
a020: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
a030: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
a040: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
a050: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
a060: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  ideFilename = sq
a070: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
a080: 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
a090: 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
a0a0: 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
a0b0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
a0c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a0d0: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
a0e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
a0f0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
a100: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
a110: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b           nChar);
a140: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
a150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
a160: 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ree(zWideFilenam
a170: 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c  e);.    zWideFil
a180: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
a190: 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c   return zWideFil
a1a0: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
a1b0: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
a1c0: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46  t Unicode to UTF
a1d0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
a1e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
a1f0: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74  string is.** obt
a200: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
a210: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
a220: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
a230: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
a240: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
a250: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
a260: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
a270: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  e;..  nByte = os
a280: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
a290: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
a2a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
a2b0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
a2c0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
a2d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a2e0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
a2f0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
a300: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
a310: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
a320: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a330: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
a340: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
a350: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
a360: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
a370: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
a380: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
a3b0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
a3c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a3d0: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
a3e0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
a3f0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a400: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
a410: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
a420: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
a430: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
a440: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
a450: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
a460: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
a470: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
a480: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
a490: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
a4a0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
a4b0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
a4c0: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
a4d0: 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55  c LPWSTR mbcsToU
a4e0: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
a4f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
a500: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50   int nByte;.  LP
a510: 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61  WSTR zMbcsFilena
a520: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
a530: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
a540: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
a550: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
a560: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
a570: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
a580: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
a590: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
a5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
a5d0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
a5e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a5f0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69  0;.  }.  zMbcsFi
a600: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
a610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
a620: 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69  e*sizeof(zMbcsFi
a630: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
a640: 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  if( zMbcsFilenam
a650: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a660: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
a670: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
a680: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
a690: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
a6a0: 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e  , -1, zMbcsFilen
a6b0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69       nByte);.  i
a6e0: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
a6f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a700: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a  zMbcsFilename);.
a710: 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d      zMbcsFilenam
a720: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a730: 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  urn zMbcsFilenam
a740: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
a750: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
a760: 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62  icode to multi-b
a770: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
a780: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
a790: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53  he.** user's ANS
a7a0: 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  I codepage..**.*
a7b0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
a7c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
a7d0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
a7e0: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
a7f0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
a800: 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64  tic char *unicod
a810: 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20  eToMbcs(LPCWSTR 
a820: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
a830: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
a840: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
a850: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
a860: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
a870: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
a880: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
a890: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
a8a0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
a8b0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
a8c0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
a8d0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
a8e0: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
a8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a900: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
a910: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
a920: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
a930: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
a940: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a950: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
a960: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
a970: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
a980: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a990: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
a9c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
a9d0: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a9e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
a9f0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
aa00: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
aa10: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
aa20: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
aa30: 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20  nvert multibyte 
aa40: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
aa50: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
aa60: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
aa70: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
aa80: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
aa90: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
aaa0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
aab0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
aac0: 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68  to_utf8(const ch
aad0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
aae0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
aaf0: 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  eUtf8;.  LPWSTR 
ab00: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
ab10: 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e  pWide = mbcsToUn
ab20: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
ab30: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
ab40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ab50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
ab60: 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  nameUtf8 = unico
ab70: 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64  deToUtf8(zTmpWid
ab80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
ab90: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
aba0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
abb0: 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Utf8;.}../*.** C
abc0: 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20  onvert UTF-8 to 
abd0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
abe0: 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61  ter string.  Spa
abf0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a  ce to hold the .
ac00: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
ac10: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
ac20: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
ac30: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
ac40: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
ac50: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
ac60: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
ac70: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
ac80: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
ac90: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
aca0: 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f  TmpWide = utf8To
acb0: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
acc0: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
acd0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
ace0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
acf0: 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69  lenameMbcs = uni
ad00: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
ad10: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
ad20: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
ad30: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
ad40: 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meMbcs;.}../*.**
ad50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
ad60: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
ad70: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
ad80: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
ad90: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
ada0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
adb0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
adc0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
add0: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
ade0: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
adf0: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
ae00: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ae10: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ae20: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
ae30: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
ae40: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ae50: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
ae60: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
ae70: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
ae80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
ae90: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
aea0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
aeb0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
aec0: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
aed0: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
aee0: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
aef0: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
af00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
af10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
af20: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
af30: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
af40: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
af50: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
af60: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
af70: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
af80: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
af90: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
afa0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
afb0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( 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 20 29 7b 0a  RECTORY_TYPE ){.
afe0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
aff0: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
b000: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
b010: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
b020: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
b030: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
b040: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
b050: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
b060: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
b070: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
b080: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
b090: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
b0a0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
b0b0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
b0c0: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
b0d0: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
b0e0: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
b0f0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
b100: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
b110: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
b120: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
b130: 6c 75 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64  lueUtf8 = unicod
b140: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
b150: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
b160: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
b170: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b180: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
b190: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
b1a0: 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65  te3_free(*ppDire
b1b0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44  ctory);.    *ppD
b1c0: 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75  irectory = zValu
b1d0: 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72  eUtf8;.    retur
b1e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b1f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b200: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
b210: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
b220: 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f  e of getLastErro
b230: 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rMsg.** is zero 
b240: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
b250: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
b260: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
b270: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
b280: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
b290: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
b2a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b2b0: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
b2c0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
b2d0: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
b2e0: 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72  *zBuf){.  /* For
b2f0: 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72  matMessage retur
b300: 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e  ns 0 on failure.
b310: 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20    Otherwise it. 
b320: 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
b330: 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73  number of TCHARs
b340: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b350: 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66  output.  ** buff
b360: 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68  er, excluding th
b370: 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75  e terminating nu
b380: 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20  ll char..  */.  
b390: 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b  DWORD dwLen = 0;
b3a0: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  .  char *zOut = 
b3b0: 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  0;..  if( isNT()
b3c0: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
b3d0: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
b3e0: 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58 5f  R zTempWide[MAX_
b3f0: 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54 45  PATH+1]; /* NOTE
b400: 3a 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69 74  : Somewhat arbit
b410: 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77 4c  rary. */.    dwL
b420: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
b430: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
b440: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
b450: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
b480: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
b4b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
b4d0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
b520: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
b540: 41 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20 20  AX_PATH,.       
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a        0);.#else.
b570: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
b580: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
b590: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
b5a0: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
b5b0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
b5c0: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
b5f0: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
b600: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
b630: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
b640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
b660: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
b6d0: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
b720: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77  endif.    if( dw
b730: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
b740: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
b750: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
b760: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
b770: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
b780: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b790: 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63       zOut = unic
b7a0: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
b7b0: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
b7c0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
b7d0: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
b7e0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
b7f0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
b800: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
b810: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
b820: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
b830: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
b840: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
b850: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
b860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b870: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
b880: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
b890: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
b8a0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
b8b0: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
b8c0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
b8d0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
b900: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
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 46 4f 52 4d 41 54            FORMAT
b930: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
b940: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
b990: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
b9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
ba00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
ba20: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
ba30: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
ba40: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
ba50: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
ba60: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
ba70: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
ba80: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
ba90: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
baa0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
bab0: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
bac0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
bad0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
bae0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
baf0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
bb00: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
bb10: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
bb20: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
bb30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
bb40: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
bb50: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
bb60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
bb70: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
bb80: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
bb90: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
bba0: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
bbb0: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
bbc0: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
bbd0: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
bbe0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
bbf0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
bc00: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
bc10: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
bc20: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
bc30: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
bc40: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
bc50: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
bc60: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
bc70: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
bc80: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
bc90: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
bca0: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
bcb0: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
bcc0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
bcd0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
bce0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
bcf0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
bd00: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
bd10: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
bd20: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
bd30: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
bd40: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
bd50: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
bd60: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
bd70: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
bd80: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
bd90: 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74   from .** Format
bda0: 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  Message..**.** T
bdb0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
bdc0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
bdd0: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
bde0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
bdf0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
be00: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
be10: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
be20: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
be30: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
be40: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
be50: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
be60: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
be70: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
be80: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
be90: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73  iled and the ass
bea0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
beb0: 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79  tem path, if any
bec0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ..*/.#define win
bed0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64  LogError(a,b,c,d
bee0: 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  )   winLogErrorA
bef0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f  tLine(a,b,c,d,__
bf00: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
bf10: 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74  nt winLogErrorAt
bf20: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
bf30: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
bf40: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
bf50: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
bf60: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
bf70: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
bf80: 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20    /* Win32 last 
bf90: 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  error */.  const
bfa0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
bfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
bfc0: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
bfd0: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
bfe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bff0: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
c000: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
c010: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c020: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
c030: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
c040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
c050: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
c060: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
c070: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
c080: 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20  ar zMsg[500];   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0a0: 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
c0b0: 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20  error text */.  
c0c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c0f0: 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20  */..  zMsg[0] = 
c100: 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f  0;.  getLastErro
c110: 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20  rMsg(lastErrno, 
c120: 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
c130: 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  sg);.  assert( e
c140: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
c150: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
c160: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
c170: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73  ;.  for(i=0; zMs
c180: 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21  g[i] && zMsg[i]!
c190: 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d  ='\r' && zMsg[i]
c1a0: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
c1b0: 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20   zMsg[i] = 0;.  
c1c0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
c1d0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77  ode,.      "os_w
c1e0: 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25  in.c:%d: (%lu) %
c1f0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
c200: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
c210: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
c220: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
c230: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
c240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
c250: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
c260: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
c270: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
c280: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
c290: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
c2a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
c2b0: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
c2c0: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20  bably caused by 
c2d0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
c2e0: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
c2f0: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
c300: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
c310: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
c320: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
c330: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
c340: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
c350: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
c360: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
c370: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
c380: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
c390: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
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 0a  ERR_RETRY_DELAY.
c3c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c3d0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
c3e0: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
c3f0: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
c400: 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  32IoerrRetry = S
c410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c420: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
c430: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
c440: 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54  tryDelay = SQLIT
c450: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c460: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
c470: 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
c480: 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
c490: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
c4a0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
c4b0: 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
c4c0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
c4d0: 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
c4e0: 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
c4f0: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
c500: 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
c510: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
c520: 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72  c int retryIoerr
c530: 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
c540: 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
c550: 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
c560: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
c570: 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
c580: 33 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  32IoerrRetry ){.
c590: 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
c5a0: 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
c5b0: 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
c5c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
c5d0: 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45  f( e==ERROR_ACCE
c5e0: 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20  SS_DENIED ||.   
c5f0: 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b     e==ERROR_LOCK
c600: 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20  _VIOLATION ||.  
c610: 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41      e==ERROR_SHA
c620: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29  RING_VIOLATION )
c630: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
c640: 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 33 32 49  n32_sleep(win32I
c650: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
c660: 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
c670: 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
c680: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c690: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
c6a0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
c6b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20  .}../*.** Log a 
c6d0: 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20  I/O error retry 
c6e0: 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  episode..*/.stat
c6f0: 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72  ic void logIoerr
c700: 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20  (int nRetry){.  
c710: 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20  if( nRetry ){.  
c720: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c730: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20  LITE_IOERR, .   
c740: 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73     "delayed %dms
c750: 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e   for lock/sharin
c760: 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20  g conflict",.   
c770: 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
c780: 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
c790: 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20  nRetry+1)/2.    
c7a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
c7b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a  LITE_OS_WINCE./*
c7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c800: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73  ********.** This
c810: 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e   section contain
c820: 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45  s code for WinCE
c830: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64   only..*/.#if !d
c840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53  efined(SQLITE_MS
c850: 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
c860: 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56  ) || !SQLITE_MSV
c870: 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a  C_LOCALTIME_API.
c880: 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20 43  /*.** The MSVC C
c890: 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  RT on Windows CE
c8a0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
c8b0: 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63  localtime() func
c8c0: 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65  tion.  So.** cre
c8d0: 61 74 65 20 61 20 73 75 62 73 74 69 74 75 74 65  ate a substitute
c8e0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74  ..*/.#include <t
c8f0: 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d  ime.h>.struct tm
c900: 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74   *__cdecl localt
c910: 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74  ime(const time_t
c920: 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20   *t).{.  static 
c930: 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46  struct tm y;.  F
c940: 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d  ILETIME uTm, lTm
c950: 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70  ;.  SYSTEMTIME p
c960: 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  Tm;.  sqlite3_in
c970: 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d  t64 t64;.  t64 =
c980: 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36   *t;.  t64 = (t6
c990: 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29  4 + 11644473600)
c9a0: 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d  *10000000;.  uTm
c9b0: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d  .dwLowDateTime =
c9c0: 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30   (DWORD)(t64 & 0
c9d0: 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54  xFFFFFFFF);.  uT
c9e0: 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  m.dwHighDateTime
c9f0: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e  = (DWORD)(t64 >>
ca00: 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69   32);.  osFileTi
ca10: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
ca20: 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20  e(&uTm,&lTm);.  
ca30: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  osFileTimeToSyst
ca40: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
ca50: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
ca60: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
ca70: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
ca80: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
ca90: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
caa0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
cab0: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
cac0: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
cad0: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
cae0: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
caf0: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
cb00: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
cb10: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
cb20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
cb30: 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  e HANDLE_TO_WINF
cb40: 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a  ILE(a) (winFile*
cb50: 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69  )&((char*)a)[-(i
cb60: 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46  nt)offsetof(winF
cb70: 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41  ile,h)]../*.** A
cb80: 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e  cquire a lock on
cb90: 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f   the handle h.*/
cba0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
cbb0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48  ceMutexAcquire(H
cbc0: 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f  ANDLE h){.   DWO
cbd0: 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20  RD dwErr;.   do 
cbe0: 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f  {.     dwErr = o
cbf0: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
cc00: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
cc10: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
cc20: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
cc30: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
cc40: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
cc50: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
cc60: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
cc70: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
cc80: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
cc90: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
cca0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
ccb0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
ccc0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
ccd0: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
cce0: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
ccf0: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
cd00: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
cd10: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  File.*/.static i
cd20: 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f  nt winceCreateLo
cd30: 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ck(const char *z
cd40: 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c  Filename, winFil
cd50: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57  e *pFile){.  LPW
cd60: 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53  STR zTok;.  LPWS
cd70: 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52  TR zName;.  DWOR
cd80: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42  D lastErrno;.  B
cd90: 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41  OOL bLogged = FA
cda0: 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69  LSE;.  BOOL bIni
cdb0: 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61  t = TRUE;..  zNa
cdc0: 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  me = utf8ToUnico
cdd0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
cde0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
cdf0: 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
ce00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
ce10: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ce20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
ce30: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
ce40: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
ce50: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
ce60: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
ce70: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
ce80: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
ce90: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
cea0: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
ceb0: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
cec0: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
ced0: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
cee0: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
cef0: 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
cf00: 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
cf10: 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
cf20: 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
cf30: 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
cf40: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
cf50: 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
cf60: 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
cf70: 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
cf80: 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
cf90: 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
cfa0: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
cfb0: 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
cfc0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
cfd0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
cfe0: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
cff0: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
d000: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
d020: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
d030: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
d040: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d050: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
d060: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
d070: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
d080: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
d090: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
d0a0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
d0b0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
d0c0: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
d0d0: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
d0e0: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
d0f0: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
d100: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
d110: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
d120: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
d130: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
d140: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
d150: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
d160: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
d170: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
d180: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
d190: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
d1a0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
d1b0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
d1c0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
d1d0: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
d1e0: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
d220: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
d230: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
d270: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
d280: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
d290: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
d2a0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
d2b0: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
d2c0: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
d2d0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
d2e0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
d2f0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
d300: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
d310: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
d320: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
d330: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
d340: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
d350: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
d360: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
d370: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
d380: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
d390: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
d3a0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
d3b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
d3c0: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
d3d0: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
d3e0: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
d3f0: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
d400: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
d410: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
d420: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
d430: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
d440: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
d450: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
d460: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
d470: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
d480: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
d490: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
d4a0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d4b0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
d4c0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
d4d0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
d4e0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
d4f0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d500: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
d510: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
d520: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d530: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
d540: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
d550: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
d560: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
d570: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
d580: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
d590: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
d5a0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
d5b0: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
d5c0: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
d5d0: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
d5e0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
d5f0: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
d600: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
d610: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d620: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
d630: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
d640: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
d650: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d660: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
d670: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
d680: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
d690: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
d6a0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
d6b0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
d6c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
d6d0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
d6e0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
d6f0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
d700: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
d710: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
d720: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
d730: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
d740: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
d750: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
d760: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
d770: 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
d780: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
d790: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
d7a0: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
d7b0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
d7c0: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
d7d0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
d7e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d7f0: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
d800: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
d810: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
d820: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
d830: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
d840: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
d850: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
d860: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
d870: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
d880: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
d890: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
d8a0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
d8b0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
d8c0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
d8d0: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
d8e0: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
d8f0: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
d900: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
d910: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
d920: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
d930: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
d940: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
d950: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
d960: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
d970: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
d980: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
d990: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
d9a0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
d9b0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
d9c0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
d9d0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
d9e0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
d9f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
da00: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
da10: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
da20: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
da30: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
da40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
da50: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
da60: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
da70: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
da80: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
da90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
daa0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
dab0: 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
dac0: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
dad0: 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
dae0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
daf0: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
db00: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
db10: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
db20: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
db30: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
db40: 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
db50: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
db60: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
db70: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
db80: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
db90: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
dba0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
dbb0: 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
dbc0: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
dbd0: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
dbe0: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
dbf0: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
dc00: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
dc10: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
dc20: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
dc30: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
dc40: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
dc50: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
dc60: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
dc70: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
dc80: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
dc90: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
dca0: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
dcb0: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
dcc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
dcd0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
dce0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
dcf0: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
dd00: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
dd10: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
dd20: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
dd30: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
dd40: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
dd50: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
dd60: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
dd70: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
dd80: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
dd90: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
dda0: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
ddb0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
ddc0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
ddd0: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
dde0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
ddf0: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
de00: 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
de10: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
de20: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
de30: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
de40: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
de50: 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
de60: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
de70: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
de80: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
de90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
dea0: 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
deb0: 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
dec0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
ded0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
dee0: 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
def0: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
df00: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
df10: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
df20: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
df30: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
df40: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
df50: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
df60: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
df70: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
df80: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
df90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
dfa0: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
dfc0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
dfd0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
dfe0: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
dff0: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
e000: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
e010: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
e020: 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
e030: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
e040: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
e050: 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
e060: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
e070: 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
e080: 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
e090: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
e0a0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
e0b0: 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
e0c0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e0d0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
e0e0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e0f0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
e100: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
e110: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e120: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
e130: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
e140: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
e150: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
e160: 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
e170: 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
e180: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
e190: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
e1a0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
e1b0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
e1c0: 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
e1d0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e1e0: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
e1f0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
e200: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
e210: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
e220: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
e230: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
e240: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
e250: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
e260: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
e280: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
e290: 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
e2a0: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
e2b0: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
e2c0: 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
e2d0: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
e2e0: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
e2f0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
e300: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
e310: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
e320: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
e330: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
e340: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
e350: 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
e360: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
e370: 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
e380: 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
e390: 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
e3a0: 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
e3b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
e3c0: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
e3d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e3e0: 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
e3f0: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
e400: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
e410: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
e420: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
e430: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
e440: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
e450: 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
e460: 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
e470: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
e480: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
e490: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
e4a0: 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
e4b0: 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
e4c0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e4d0: 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
e4e0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
e4f0: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
e500: 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
e510: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
e520: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
e530: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
e540: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
e550: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
e560: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e570: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
e580: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
e590: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
e5a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
e5b0: 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
e5c0: 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
e5d0: 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
e5e0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
e5f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e600: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e610: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
e620: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
e640: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e650: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
e660: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e670: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
e680: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
e690: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
e6a0: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
e6b0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
e6c0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
e6d0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
e6e0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
e6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
e700: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
e710: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
e720: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
e730: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
e740: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
e750: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
e760: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
e770: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
e780: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
e790: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
e7a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e7b0: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
e7c0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
e7d0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
e7e0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
e7f0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
e800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
e810: 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
e820: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
e830: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
e840: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e850: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
e860: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
e870: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
e880: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
e890: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
e8a0: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
e8b0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e8c0: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
e8d0: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
e8e0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
e8f0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
e900: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
e910: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
e920: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
e930: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
e940: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
e950: 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
e960: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
e970: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
e980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
e9d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e9e0: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
e9f0: 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
ea00: 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
ea10: 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
ea20: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
ea30: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
ea40: 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
ea50: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
ea60: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
ea70: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
ea80: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
ea90: 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
eaa0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
eab0: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
eac0: 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
ead0: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
eae0: 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
eaf0: 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
eb00: 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
eb10: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
eb20: 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
eb30: 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
eb40: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
eb50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb60: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
eb70: 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
eb80: 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
eb90: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  isNT() ){.    OV
eba0: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
ebb0: 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
ebc0: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
ebd0: 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
ebe0: 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
ebf0: 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
ec00: 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
ec10: 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
ec20: 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
ec30: 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  *phFile, flags, 
ec40: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
ec50: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
ec60: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
ec70: 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
ec80: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
ec90: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
eca0: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
ecb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ecc0: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
ecd0: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
ece0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  f.}../*.** Unloc
ecf0: 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e  k a file region.
ed00: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  . */.static BOOL
ed10: 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a   winUnlockFile(.
ed20: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
ed30: 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  e,.  DWORD offse
ed40: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
ed50: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
ed60: 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
ed70: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
ed80: 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
ed90: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
eda0: 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
edb0: 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
edc0: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
edd0: 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
ede0: 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
edf0: 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63         API Unloc
ee00: 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
ee10: 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  turn winceUnlock
ee20: 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
ee30: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
ee40: 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
ee60: 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
ee70: 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
ee80: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
ee90: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
eea0: 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
eeb0: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
eec0: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
eed0: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
eee0: 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
eef0: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
ef00: 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
ef10: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
ef20: 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
ef30: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
ef40: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
ef50: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
ef60: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
ef70: 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
ef80: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
ef90: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
efa0: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
efc0: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
efd0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  endif.}../******
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
f030: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
f040: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
f050: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
f060: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
f070: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
f080: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
f090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f0e0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
f0f0: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
f100: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
f110: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
f120: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f130: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
f140: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
f150: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
f160: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
f170: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
f180: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
f190: 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
f1a0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
f1b0: 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
f1c0: 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
f1d0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
f1e0: 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
f1f0: 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
f200: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
f210: 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
f220: 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
f230: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
f240: 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c  c int seekWinFil
f250: 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
f260: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
f270: 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
f280: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
f290: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
f2c0: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
f2d0: 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
f2e0: 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
f2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
f300: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
f310: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
f320: 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
f350: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
f360: 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
f370: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f390: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
f3a0: 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
f3b0: 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   */..  OSTRACE((
f3c0: 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "SEEK file=%p, o
f3d0: 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70  ffset=%lld\n", p
f3e0: 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74  File->h, iOffset
f3f0: 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73  ));..  upperBits
f400: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
f410: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
f420: 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
f430: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
f440: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
f450: 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
f460: 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
f470: 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
f480: 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
f490: 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
f4a0: 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
f4b0: 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
f4c0: 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
f4d0: 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
f4e0: 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
f4f0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
f500: 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
f510: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
f520: 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
f530: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
f540: 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
f550: 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
f560: 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
f570: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
f580: 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
f590: 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65  actually occurre
f5a0: 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
f5b0: 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
f5c0: 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
f5d0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
f5e0: 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
f5f0: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
f600: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
f610: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
f620: 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
f630: 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
f640: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
f650: 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
f660: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
f670: 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
f680: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
f690: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
f6a0: 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
f6b0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f6c0: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
f6d0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
f6e0: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
f6f0: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
f700: 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
f710: 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
f720: 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
f730: 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
f740: 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
f750: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
f760: 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
f770: 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
f780: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
f790: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c  .  return 0;.#el
f7a0: 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d  se.  /*.  ** Sam
f7b0: 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65  e as above, exce
f7c0: 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70  pt that this imp
f7d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b  lementation work
f7e0: 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a  s for WinRT..  *
f7f0: 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  /..  LARGE_INTEG
f800: 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  ER x;           
f810: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
f820: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c  offset */.  BOOL
f830: 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20   bRet;          
f840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f850: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
f860: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45   SetFilePointerE
f870: 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64  x() */..  x.Quad
f880: 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a  Part = iOffset;.
f890: 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69    bRet = osSetFi
f8a0: 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c  lePointerEx(pFil
f8b0: 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45  e->h, x, 0, FILE
f8c0: 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21  _BEGIN);..  if(!
f8d0: 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65  bRet){.    pFile
f8e0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
f8f0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
f900: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
f910: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
f920: 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
f930: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
f940: 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c    "seekWinFile",
f950: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
f960: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45      OSTRACE(("SE
f970: 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
f980: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
f990: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
f9a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f9b0: 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
f9c0: 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
f9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
f9e0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
f9f0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
fa00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
fa10: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46  MMAP_SIZE>0./* F
fa20: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
fa30: 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
fa40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
fa50: 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
fa60: 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ile*);.#endif../
fa70: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
fa80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
fa90: 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
faa0: 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
fab0: 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
fac0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
fad0: 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
fae0: 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
faf0: 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64  result, but Wind
fb00: 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
fb10: 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
fb20: 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
fb30: 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
fb40: 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
fb50: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
fb60: 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
fb70: 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
fb80: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
fb90: 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
fba0: 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
fbb0: 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
fbc0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
fbd0: 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
fbe0: 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
fbf0: 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
fc00: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
fc10: 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
fc20: 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
fc30: 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
fc40: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
fc50: 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
fc60: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
fc70: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
fc80: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  d;..  assert( id
fc90: 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
fca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
fcb0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
fcc0: 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  pShm==0 );.#endi
fcd0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  f.  assert( pFil
fce0: 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46  e->h!=NULL && pF
fcf0: 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f  ile->h!=INVALID_
fd00: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
fd10: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
fd20: 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46  E file=%p\n", pF
fd30: 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53  ile->h));..#if S
fd40: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
fd50: 49 5a 45 3e 30 0a 20 20 72 63 20 3d 20 77 69 6e  IZE>0.  rc = win
fd60: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
fd70: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
fd80: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
fd90: 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b  c;.#endif..  do{
fda0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73  .    rc = osClos
fdb0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
fdc0: 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
fdd0: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
fde0: 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
fdf0: 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
fe00: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
fe10: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
fe20: 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c  _ATTEMPT && (sql
fe30: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
fe40: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
fe50: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
fe60: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
fe70: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
fe80: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
fe90: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
fea0: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
feb0: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
fec0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
fed0: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
fee0: 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
fef0: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
ff00: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
ff10: 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
ff20: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
ff30: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
ff40: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
ff50: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
ff60: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
ff70: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
ff80: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
ff90: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
ffa0: 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69  );  /* Wait a li
ffb0: 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69  ttle before tryi
ffc0: 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ng again */.    
ffd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
ffe0: 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  ee(pFile->zDelet
fff0: 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23  eOnClose);.  }.#
10000 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29  endif.  if( rc )
10010 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  {.    pFile->h =
10020 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65   NULL;.  }.  Ope
10030 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
10040 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
10050 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
10060 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  ", pFile->h, rc 
10070 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
10080 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
10090 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
100a0 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
100b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
100c0 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
100d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
10100 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
10110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
10120 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
10130 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
10140 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10150 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
10160 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
10170 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
10180 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
10190 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
101a0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
101b0 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
101c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
101d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
101e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
101f0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10210 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
10220 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
10230 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10260 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
10270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
10280 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
10290 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
102a0 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
102b0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
102c0 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50  WINCE.  OVERLAPP
102d0 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
102e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
102f0 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69  ffset for ReadFi
10300 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  le. */.#endif.  
10310 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10320 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
10330 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* file handle *
10340 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b  /.  DWORD nRead;
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10370 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
10380 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
10390 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
103a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
103b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
103c0 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73   retrys */..  as
103d0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
103e0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
103f0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
10400 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  et>=0 );.  Simul
10410 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
10420 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
10430 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  EAD);.  OSTRACE(
10440 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
10450 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
10460 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  t=%d, offset=%ll
10470 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
10480 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
10490 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
104a0 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
104b0 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
104c0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
104d0 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
104e0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
104f0 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
10500 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
10510 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
10520 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
10530 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
10540 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
10550 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
10560 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
10570 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
10580 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
10590 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
105a0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
105b0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
105c0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
105d0 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
105e0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
105f0 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  MMAP file=%p, rc
10600 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
10610 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
10620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10630 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
10640 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
10650 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
10660 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
10670 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
10680 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
10690 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
106a0 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  [offset], nCopy)
106b0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
106c0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
106d0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
106e0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
106f0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
10700 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
10710 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
10720 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65 6b  WINCE.  if( seek
10730 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
10740 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53  ffset) ){.    OS
10750 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
10760 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
10770 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
10780 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
10790 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
107a0 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
107b0 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
107c0 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
107d0 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  d, 0) ){.#else. 
107e0 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
107f0 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
10800 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f  VERLAPPED));.  o
10810 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
10820 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
10830 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
10840 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
10850 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
10860 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
10870 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77  0x7fffffff);.  w
10880 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
10890 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
108a0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26  , amt, &nRead, &
108b0 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20  overlapped) &&. 
108c0 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
108d0 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
108e0 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65  HANDLE_EOF ){.#e
108f0 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c  ndif.    DWORD l
10900 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66  astErrno;.    if
10910 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
10920 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
10930 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
10940 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10950 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
10960 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
10970 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
10980 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
10990 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
109a0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
109b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
109c0 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65  OERR_READ, pFile
109d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
109e0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65            "winRe
109f0 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ad", pFile->zPat
10a00 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65  h);.  }.  logIoe
10a10 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66  rr(nRetry);.  if
10a20 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
10a30 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
10a40 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
10a50 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
10a60 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
10a70 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
10a80 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
10a90 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
10aa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
10ab0 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
10ac0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
10ad0 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65  T_READ\n", pFile
10ae0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
10af0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
10b00 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  HORT_READ;.  }..
10b10 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
10b20 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
10b30 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
10b40 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
10b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10b60 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
10b70 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
10b80 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
10b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
10ba0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
10bb0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
10bc0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
10bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10be0 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
10bf0 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
10c00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
10c10 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
10c20 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
10c30 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
10c40 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
10c50 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
10c60 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10c90 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
10ca0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
10cb0 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
10cc0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
10cd0 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
10ce0 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
10cf0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
10d00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10d10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10d20 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
10d30 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  curred, else fal
10d40 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
10d50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
10d60 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
10d70 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
10d80 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
10d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10da0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
10db0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
10dc0 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
10dd0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
10de0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
10df0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10e00 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
10e10 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
10e20 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
10e30 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
10e40 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
10e50 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
10e60 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  unt=%d, offset=%
10e70 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
10e80 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
10e90 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
10ea0 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e   offset, pFile->
10eb0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
10ec0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10ed0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
10ee0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
10ef0 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
10f00 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
10f10 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
10f20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
10f30 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
10f40 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
10f50 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
10f60 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
10f70 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
10f80 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
10f90 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
10fa0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
10fb0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
10fc0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
10fd0 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
10fe0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
10ff0 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70  ITE-MMAP file=%p
11000 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
11010 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
11020 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11030 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
11040 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
11050 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d  y = (int)(pFile-
11060 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
11070 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  et);.      memcp
11080 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
11090 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
110a0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
110b0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
110c0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
110d0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
110e0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
110f0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
11100 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
11110 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
11120 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d  _OS_WINCE.  rc =
11130 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
11140 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
11150 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
11160 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
11170 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
11180 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  E.    OVERLAPPED
11190 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
111a0 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
111b0 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
111c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
111d0 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
111e0 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
111f0 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
11200 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
11210 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11230 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
11240 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
11250 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
11260 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
11270 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
11280 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
11290 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
112a0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
112b0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
112c0 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
112d0 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
112e0 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
112f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
11300 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  E.    memset(&ov
11310 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
11320 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11330 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
11340 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
11350 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
11360 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
11370 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
11380 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
11390 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
113a0 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
113b0 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
113c0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
113d0 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28  _WINCE.      if(
113e0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
113f0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
11400 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
11410 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
11420 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
11430 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
11440 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
11450 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
11460 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
11470 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
11480 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
11490 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
114a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
114b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
114c0 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
114d0 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
114e0 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
114f0 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
11500 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
11510 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
11520 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11530 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
11540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11550 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
11560 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
11570 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
11580 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
11590 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
115a0 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
115b0 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
115c0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
115d0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
115e0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
115f0 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
11600 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
11610 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
11620 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
11630 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
11640 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
11650 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11660 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
11670 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
11680 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
11690 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
116a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
116b0 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
116c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
116d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
116e0 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
116f0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
11700 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
11710 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
11720 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
11730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11740 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
11750 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
11760 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
11770 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  =SQLITE_IOERR_WR
11780 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ITE\n", pFile->h
11790 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
117a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
117b0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
117c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
117d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
117e0 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d  inWrite", pFile-
117f0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
11800 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e  {.    logIoerr(n
11810 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53  Retry);.  }.  OS
11820 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69  TRACE(("WRITE fi
11830 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
11840 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
11850 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
11860 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11870 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
11880 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
11890 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
118a0 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
118b0 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
118c0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
118d0 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
118e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
118f0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
11900 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
11910 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
11920 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
11930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
11940 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
11950 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
11960 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
11970 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11980 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
11990 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
119a0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
119b0 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
119c0 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d  ("TRUNCATE file=
119d0 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
119e0 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
119f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
11a00 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
11a10 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
11a20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
11a30 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
11a40 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
11a50 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
11a60 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
11a70 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
11a80 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
11a90 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
11aa0 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
11ab0 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
11ac0 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
11ad0 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
11ae0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
11af0 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
11b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11b10 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
11b20 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
11b30 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
11b40 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
11b50 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
11b60 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
11b70 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
11b80 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
11b90 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
11ba0 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
11bb0 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
11bc0 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46  /.  if( seekWinF
11bd0 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
11be0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
11bf0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11c00 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
11c10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11c20 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11c30 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
11c40 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
11c50 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
11c60 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
11c70 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
11c80 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
11c90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
11ca0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
11cb0 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
11cc0 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
11cd0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11ce0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
11cf0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
11d00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
11d10 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
11d20 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11d40 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
11d50 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
11d60 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
11d70 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11d80 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
11d90 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
11da0 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
11db0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
11dc0 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
11dd0 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
11de0 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
11df0 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
11e00 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
11e10 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
11e20 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
11e30 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
11e40 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
11e50 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
11e60 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
11e70 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
11e80 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
11e90 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
11ea0 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
11eb0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
11ec0 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69  CE(("TRUNCATE fi
11ed0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
11ee0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
11ef0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
11f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11f10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11f20 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
11f30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
11f40 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
11f50 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
11f60 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
11f70 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
11f80 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
11f90 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
11fa0 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
11fb0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
11fc0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
11fd0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
11fe0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
11ff0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
12000 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
12010 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
12020 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
12030 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
12040 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
12050 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12060 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
12070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
12080 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _SYNC.  /*.  ** 
12090 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53  Used only when S
120a0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
120b0 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20   not defined..  
120c0 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23   */.  BOOL rc;.#
120d0 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
120e0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
120f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
12100 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20  _SYNC) || \.    
12110 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
12120 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
12130 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a  (SQLITE_DEBUG)).
12140 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77    /*.  ** Used w
12150 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
12160 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
12170 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73  d and by the ass
12180 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a  ert() and/or.  *
12190 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72  * OSTRACE() macr
121a0 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46  os..   */.  winF
121b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
121c0 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65  nFile*)id;.#else
121d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
121e0 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a  TER(id);.#endif.
121f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12200 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   );.  /* Check t
12210 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
12220 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
12230 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
12240 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
12250 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
12260 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
12270 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
12280 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
12290 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
122a0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
122b0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
122c0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
122d0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
122e0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
122f0 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
12300 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
12310 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
12320 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
12330 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
12340 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12350 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54  E_FULL );..  OST
12360 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
12370 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c  =%p, flags=%x, l
12380 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
12390 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
123a0 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f  flags, pFile->lo
123b0 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64  cktype));..#ifnd
123c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
123d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
123e0 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
123f0 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
12400 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
12410 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
12420 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
12430 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
12440 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
12450 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
12460 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
12470 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
12480 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
12490 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
124a0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
124b0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
124c0 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  YNC.  return SQL
124d0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
124e0 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
124f0 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
12500 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
12510 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
12520 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
12530 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
12540 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12550 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
12560 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12580 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
12590 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
125a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
125b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
125c0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
125d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
125e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
125f0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
12600 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12610 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
12620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
12630 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
12640 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
12650 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
12660 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
12670 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
12680 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
12690 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
126a0 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
126b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
126c0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
126d0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46   *pSize){.  winF
126e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
126f0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
12700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12710 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
12720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12730 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d  Size!=0 );.  Sim
12740 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
12750 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12760 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41  _FSTAT);.  OSTRA
12770 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25  CE(("SIZE file=%
12780 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20  p, pSize=%p\n", 
12790 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29  pFile->h, pSize)
127a0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
127b0 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20  S_WINRT.  {.    
127c0 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e  FILE_STANDARD_IN
127d0 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28  FO info;.    if(
127e0 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d   osGetFileInform
127f0 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28  ationByHandleEx(
12800 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74  pFile->h, FileSt
12810 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20  andardInfo,.    
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69   &info, sizeof(i
12850 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a  nfo)) ){.      *
12860 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64  pSize = info.End
12870 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b  OfFile.QuadPart;
12880 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12890 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
128a0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
128b0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
128c0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
128d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
128e0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
128f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12900 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
12910 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
12920 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
12930 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20   }.#else.  {.   
12940 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73   DWORD upperBits
12950 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65  ;.    DWORD lowe
12960 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
12970 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20   lastErrno;..   
12980 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47   lowerBits = osG
12990 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65  etFileSize(pFile
129a0 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29  ->h, &upperBits)
129b0 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28  ;.    *pSize = (
129c0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
129d0 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20  upperBits)<<32) 
129e0 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  + lowerBits;.   
129f0 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74   if(   (lowerBit
12a00 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  s == INVALID_FIL
12a10 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26  E_SIZE).       &
12a20 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
12a30 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12a40 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a  )!=NO_ERROR) ){.
12a50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12a60 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
12a70 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  no;.      rc = w
12a80 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12a90 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70  E_IOERR_FSTAT, p
12aa0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
12ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
12ac0 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
12ad0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
12ae0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
12af0 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
12b00 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
12b10 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
12b20 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
12b30 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
12b40 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
12b50 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
12b60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12b70 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
12b80 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
12b90 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
12ba0 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
12bb0 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
12bc0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
12bd0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
12be0 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
12bf0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
12c00 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
12c10 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
12c20 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
12c30 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
12c40 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
12c50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
12c60 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
12c70 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
12c80 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
12c90 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
12ca0 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
12cb0 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
12cc0 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
12cd0 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
12ce0 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
12cf0 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
12d00 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
12d10 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
12d20 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
12d30 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
12d40 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
12d50 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
12d60 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
12d70 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
12d80 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
12d90 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
12da0 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
12db0 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
12dc0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
12dd0 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
12de0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
12df0 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
12e00 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
12e10 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
12e20 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
12e30 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
12e60 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
12e70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12e80 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
12e90 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
12ea0 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
12eb0 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
12ec0 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
12ed0 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
12ee0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
12ef0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
12f00 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
12f10 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
12f20 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
12f30 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12f40 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
12f50 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
12f60 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
12f70 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
12f80 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
12f90 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
12fa0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
12fb0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
12fc0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
12fd0 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
12fe0 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
12ff0 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  int getReadLock(
13000 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
13010 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
13020 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
13030 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
13040 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
13050 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13060 29 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  ));.  if( isNT()
13070 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
13080 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
13090 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
130a0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
130b0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
130c0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
130d0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
130e0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
130f0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
13100 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
13110 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
13120 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
13130 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
13140 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
13150 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13160 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
13170 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
13180 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
131b0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
131c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
131d0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
131e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
131f0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
13200 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
13210 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
13220 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
13230 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
13240 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
13250 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
13260 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
13270 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
13280 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
13290 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
132c0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
132d0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
132e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
132f0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
13300 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13310 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13320 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
13330 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
13340 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
13350 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
13360 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
13370 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
13380 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
13390 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
133a0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
133b0 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
133c0 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
133d0 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  nt unlockReadLoc
133e0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
133f0 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
13400 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13410 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13420 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
13430 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
13440 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
13450 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
13460 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
13470 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
13480 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
13490 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
134a0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
134b0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
134c0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
134d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
134e0 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
134f0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
13500 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
13510 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
13520 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
13530 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d  ndif.  if( res==
13540 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f  0 && ((lastErrno
13550 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13560 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  r())!=ERROR_NOT_
13570 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70  LOCKED) ){.    p
13580 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13590 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
135a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
135b0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
135c0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
135d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
135e0 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b   "unlockReadLock
135f0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13600 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
13610 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
13620 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
13630 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
13640 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
13650 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
13660 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
13670 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
13680 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
13690 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
136a0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
136b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
136c0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
136d0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
136e0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
136f0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
13700 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
13710 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
13720 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
13730 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
13740 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
13750 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
13760 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
13770 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
13780 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
13790 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
137a0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
137b0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
137c0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
137d0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
137e0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
137f0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
13800 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
13810 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
13820 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
13830 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
13840 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
13850 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
13860 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
13870 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
13880 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
13890 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
138a0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
138b0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
138c0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
138d0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
138e0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
138f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13900 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
13910 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
13920 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13930 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13940 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
13950 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
13960 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
13970 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
13980 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
13990 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
139a0 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
139b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
139c0 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
139d0 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
139e0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
139f0 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
13a00 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
13a10 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
13a20 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
13a30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13a40 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
13a50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13a60 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
13a70 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
13a80 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
13a90 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
13aa0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
13ab0 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
13ac0 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
13ad0 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
13ae0 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
13af0 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
13b00 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
13b10 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
13b20 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
13b30 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
13b40 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
13b50 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
13b60 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
13b70 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
13b80 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
13b90 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
13ba0 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
13bb0 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
13bc0 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
13bd0 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
13be0 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
13bf0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13c00 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
13c10 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
13c20 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
13c30 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
13c40 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
13c50 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
13c60 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
13c70 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
13c80 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
13c90 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
13ca0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
13cb0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
13cc0 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
13cd0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
13ce0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
13cf0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
13d00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
13d10 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
13d20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
13d30 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
13d40 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
13d50 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13d80 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
13d90 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
13da0 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
13db0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
13dc0 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
13dd0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
13de0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
13df0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
13e00 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
13e10 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
13e20 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
13e30 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
13e40 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13e50 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
13e60 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
13e70 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
13e80 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
13e90 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
13ea0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
13eb0 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
13ec0 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
13ed0 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
13ee0 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
13ef0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
13f00 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
13f10 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
13f20 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
13f30 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
13f40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
13f50 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
13f60 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
13f70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
13f80 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
13f90 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
13fa0 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
13fb0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
13fc0 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
13fd0 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
13fe0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
13ff0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
14000 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
14040 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
14050 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
14060 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
14070 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
14080 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
14090 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
140a0 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
140b0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
140c0 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
140d0 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
140e0 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
140f0 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
14100 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
14110 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
14120 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
14130 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
14140 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
14150 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
14160 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
14170 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
14180 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
14190 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
141a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
141b0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
141c0 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
141d0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
141e0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
141f0 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
14200 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
14210 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
14220 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
14230 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
14240 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
14250 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
14260 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
14270 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
14280 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14290 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
142a0 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
142b0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
142c0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
142d0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
142e0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
142f0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
14300 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
14310 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
14320 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
14330 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
14340 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
14350 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
14360 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
14370 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
14380 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
14390 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
143a0 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
143b0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
143c0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
143d0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
143e0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
143f0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
14400 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
14410 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
14420 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
14430 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
14440 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
14450 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
14460 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
14470 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
14480 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
14490 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
144a0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
144b0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
144c0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
144d0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
144e0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
144f0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
14500 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
14510 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
14520 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
14530 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
14540 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
14550 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
14560 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
14570 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
14580 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
14590 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
145a0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
145b0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
145c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
145d0 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
145e0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
145f0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
14600 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
14610 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
14620 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
14650 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
14660 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
14670 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
14680 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
14690 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
146a0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
146b0 72 28 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65  r();.      getRe
146c0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
146d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
146e0 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
146f0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
14700 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
14710 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
14720 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
14730 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
14740 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
14750 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
14760 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
14770 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
14780 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
14790 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
147a0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
147b0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
147c0 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
147d0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
147e0 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
147f0 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
14800 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
14810 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
14820 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
14830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
14840 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  se{.    OSTRACE(
14850 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
14860 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
14870 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
14880 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14890 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
148a0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70  ocktype));.    p
148b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
148c0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
148d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
148e0 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  Y;.  }.  pFile->
148f0 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e  locktype = (u8)n
14900 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  ewLocktype;.  OS
14910 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c  TRACE(("LOCK fil
14920 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
14930 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
14940 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
14950 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
14960 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
14970 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
14980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14990 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
149a0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
149b0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
149c0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
149d0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
149e0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
149f0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
14a00 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
14a10 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
14a20 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
14a30 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
14a40 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
14a50 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
14a60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
14a70 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
14a80 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
14a90 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
14aa0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
14ab0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14ac0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
14ad0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
14ae0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14af0 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
14b00 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
14b10 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
14b20 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ut));..  assert(
14b30 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   id!=0 );.  if( 
14b40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
14b50 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
14b60 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
14b70 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14b80 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
14b90 2c 20 72 63 3d 25 64 20 28 6c 6f 63 61 6c 29 5c  , rc=%d (local)\
14ba0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14bb0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
14bc0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
14bd0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
14be0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
14bf0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
14c00 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
14c10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14c20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
14c30 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
14c40 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
14c50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
14c60 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
14c70 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
14c80 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  CK file=%p, rc=%
14c90 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
14ca0 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
14cb0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
14cc0 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
14cd0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
14ce0 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
14cf0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
14d00 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
14d10 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14d20 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ->h, pResOut, *p
14d30 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
14d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14d50 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
14d60 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14d70 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
14d80 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
14d90 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
14da0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
14db0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
14dc0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
14dd0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14de0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
14df0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14e00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14e10 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14e20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14e30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14e40 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
14e50 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
14e60 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
14e70 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
14e80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14e90 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
14ea0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
14eb0 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
14ec0 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
14ed0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
14ee0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
14ef0 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
14f00 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
14f10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14f20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
14f30 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
14f40 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14f50 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
14f60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14f70 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
14f80 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
14f90 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
14fa0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
14fb0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
14fc0 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
14fd0 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
14fe0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14ff0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
15000 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
15010 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
15020 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
15030 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
15040 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
15050 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
15060 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
15070 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
15080 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
15090 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
150a0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
150b0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
150c0 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64  LOCK && !getRead
150d0 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
150e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
150f0 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
15100 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
15110 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
15120 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
15130 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
15140 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
15150 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15160 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
15170 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
15180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15190 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
151a0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
151b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
151c0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
151d0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
151e0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
151f0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
15200 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
15210 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
15220 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
15230 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15240 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
15250 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
15260 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
15270 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
15280 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
15290 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
152a0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
152b0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
152c0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
152d0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
152e0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
152f0 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
15300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15310 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
15320 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
15330 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
15340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15350 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
15360 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61  inititially nega
15370 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
15380 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
15390 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
153a0 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
153b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
153c0 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
153d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
153e0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
153f0 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
15400 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
15410 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
15420 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
15430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15440 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46   winModeBit(winF
15450 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
15460 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
15470 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
15480 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
15490 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
154a0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
154b0 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
154c0 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
154d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
154e0 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
154f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
15500 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
15510 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
15520 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
15530 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
15540 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69  nt getTempname(i
15550 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
15560 42 75 66 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  Buf);.#if SQLITE
15570 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15580 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
15590 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c  apfile(winFile*,
155a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
155b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
155c0 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
155d0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
155e0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
155f0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
15600 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
15610 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
15620 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
15630 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
15640 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
15650 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
15660 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c   file=%p, op=%d,
15670 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69   pArg=%p\n", pFi
15680 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29  le->h, op, pArg)
15690 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
156a0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
156b0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
156c0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
156d0 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
156e0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
156f0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
15700 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15710 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15720 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
15730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15740 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
15750 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
15760 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
15770 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c  pArg = (int)pFil
15780 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
15790 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
157a0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
157b0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
157c0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
157d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
157e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
157f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
15800 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
15810 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
15820 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
15830 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15840 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15850 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15860 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15880 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
15890 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
158a0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
158b0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
158c0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
158d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
158e0 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
158f0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
15900 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
15910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15930 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15940 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
15950 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
15960 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
15970 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
15980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15990 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
159a0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
159b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
159c0 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
159d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
159e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
159f0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
15a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15a10 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
15a20 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15a30 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
15a40 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
15a50 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
15a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15a70 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
15a80 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
15a90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15aa0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15ac0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15ad0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
15ae0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
15af0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
15b00 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
15b10 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
15b20 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
15b30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
15b40 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
15b50 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
15b60 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
15b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15b90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
15ba0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
15bb0 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
15bc0 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
15bd0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
15be0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
15bf0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
15c00 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15c10 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
15c20 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
15c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15c40 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
15c50 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
15c60 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
15c70 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
15c80 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22  _mprintf("win32"
15c90 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
15ca0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
15cb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15cc0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
15cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15ce0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
15cf0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
15d00 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
15d10 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
15d20 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
15d30 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
15d40 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33   ){.        win3
15d50 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b  2IoerrRetry = a[
15d60 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
15d70 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20  .        a[0] = 
15d80 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b  win32IoerrRetry;
15d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15da0 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
15db0 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
15dc0 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d  etryDelay = a[1]
15dd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15de0 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69         a[1] = wi
15df0 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
15e00 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
15e10 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
15e20 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
15e30 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
15e40 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
15e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15e60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
15e70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
15e80 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
15e90 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
15ea0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
15eb0 72 6f 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ro( pFile->pVfs-
15ec0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
15ed0 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20       if( zTFile 
15ee0 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 54 65  ){.        getTe
15ef0 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
15f00 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
15f10 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
15f20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
15f30 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
15f40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15f50 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15f60 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15f70 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15f80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15f90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  _OK;.    }.#if S
15fa0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
15fb0 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
15fc0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
15fd0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
15fe0 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
15ff0 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
16000 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16010 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
16020 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
16030 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
16040 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
16050 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
16060 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
16070 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
16080 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
16090 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
160a0 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
160b0 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
160c0 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
160d0 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
160e0 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
160f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
16100 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
16110 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
16120 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
16130 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
16140 20 20 20 20 20 20 20 28 76 6f 69 64 29 77 69 6e         (void)win
16150 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
16160 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16170 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c   winMapfile(pFil
16180 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
16190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
161a0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
161b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 5c 6e  file=%p, rc=%d\n
161c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
161d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
161e0 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  rc;.    }.#endif
161f0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
16200 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16210 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rc=SQLITE_NOTFOU
16220 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  ND\n", pFile->h)
16230 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16240 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
16250 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16260 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
16270 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
16280 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
16290 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
162a0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
162b0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
162c0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
162d0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
162e0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
162f0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
16300 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
16310 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
16320 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
16330 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
16340 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
16350 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
16360 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
16370 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
16380 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
16390 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
163a0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
163b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
163c0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
163d0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
163e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
163f0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
16400 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76  _file *id){.  (v
16410 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  oid)id;.  return
16420 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16430 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
16440 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76  /*.** Return a v
16450 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20  ector of device 
16460 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
16470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16480 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
16490 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
164a0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
164b0 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69  File *p = (winFi
164c0 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  le*)id;.  return
164d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
164e0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
164f0 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28  PEN |.         (
16500 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  (p->ctrlFlags & 
16510 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51  WINFILE_PSOW)?SQ
16520 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
16530 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30  SAFE_OVERWRITE:0
16540 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e  );.}../* .** Win
16550 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
16560 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
16570 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
16580 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
16590 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
165a0 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
165b0 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
165c0 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
165d0 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
165e0 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
165f0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
16600 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46  e..*/.SYSTEM_INF
16610 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23  O winSysInfo;..#
16620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16630 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65  IT_WAL../*.** He
16640 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
16650 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
16660 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
16670 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
16680 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
16690 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
166a0 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
166b0 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
166c0 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20   .** this file, 
166d0 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
166e0 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
166f0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
16700 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
16710 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
16720 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
16730 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
16740 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
16750 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
16760 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
16770 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
16780 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
16790 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
167a0 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
167b0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
167c0 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
167d0 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
167e0 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
167f0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
16800 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16810 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
16820 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
16830 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
16840 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
16850 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
16860 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
16870 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
16880 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
16890 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
168a0 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
168b0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
168c0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
168d0 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
168e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
168f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
16900 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
16910 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
16920 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
16930 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
16940 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
16950 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
16960 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
16970 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
16980 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
16990 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
169a0 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
169b0 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
169c0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
169d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
169e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
169f0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
16a00 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
16a10 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
16a20 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
16a30 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
16a40 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
16a50 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
16a60 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
16a70 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
16a80 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
16a90 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
16aa0 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
16ab0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
16ac0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
16ad0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
16ae0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
16af0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
16b00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
16b10 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
16b20 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
16b30 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
16b40 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
16b50 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
16b60 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
16b70 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
16b80 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
16b90 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
16ba0 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
16bb0 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
16bc0 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
16bd0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
16be0 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
16bf0 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
16c00 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
16c10 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
16c20 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
16c30 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
16c40 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
16c50 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
16c60 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
16c70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
16c80 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
16c90 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
16ca0 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
16cb0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16cc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
16cd0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
16ce0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
16cf0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
16d00 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
16d10 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
16d20 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d40 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
16d50 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
16d60 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d80 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
16d90 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
16da0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
16db0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16dd0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
16de0 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
16df0 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
16e00 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
16e10 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
16e20 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
16e30 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
16e40 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
16e50 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
16e60 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
16e90 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
16ea0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
16eb0 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16ed0 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
16ee0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
16ef0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
16f00 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
16f10 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
16f20 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
16f30 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
16f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
16f50 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
16f60 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
16f70 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
16f80 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
16f90 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
16fa0 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
16fb0 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
16fc0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
16fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
16fe0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
16ff0 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
17000 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
17010 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
17020 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
17030 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
17040 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
17050 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
17060 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
17070 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
17080 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
17090 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
170a0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
170b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
170c0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
170d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
170e0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
170f0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
17100 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
17110 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
17120 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
17130 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
17140 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
17150 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
17160 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
17170 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
17180 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
17190 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
171a0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
171b0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
171c0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
171d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
171e0 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
171f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
17200 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
17210 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
17220 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
17230 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
17240 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
17250 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
17260 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
17270 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17280 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
17290 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
172a0 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
172b0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
172c0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
172d0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
172e0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17300 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
17310 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
17320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17330 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
17360 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
17370 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
17380 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
17390 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
173a0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
173b0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
173c0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
173d0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
173e0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
173f0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
17400 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
17410 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
17420 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
17430 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
17440 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
17450 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
17460 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
17470 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
17480 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
17490 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
174a0 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
174b0 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
174c0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
174d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
174e0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
174f0 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
17500 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
17510 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
17520 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
17530 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
17540 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
17550 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
17560 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
17570 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
17580 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
17590 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
175a0 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
175b0 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
175c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
175d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
175e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
175f0 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
17600 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
17610 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
17620 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
17630 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
17640 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
17650 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
17660 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
17670 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
17680 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
17690 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
176a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
176b0 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
176c0 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
176d0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
176e0 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
176f0 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
17700 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
17710 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17720 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
17730 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
17740 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
17750 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
17760 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
17770 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
17780 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
17790 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
177a0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
177b0 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
177c0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
177d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
177e0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
177f0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
17800 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
17810 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
17820 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
17830 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
17840 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  e == _SHM_WRLCK 
17850 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43  ) dwFlags |= LOC
17860 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
17870 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77  LOCK;.    rc = w
17880 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17890 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
178a0 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
178b0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a  yte, 0);.  }.  .
178c0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
178d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
178e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
178f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17900 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
17910 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
17920 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
17930 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
17940 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
17950 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25  func=%s, errno=%
17960 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  lu, rc=%s\n",.  
17970 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
17980 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79  hFile.h, (lockTy
17990 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b  pe == _SHM_UNLCK
179a0 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69  ) ? "winUnlockFi
179b0 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  le" :.          
179c0 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20   "winLockFile", 
179d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
179e0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
179f0 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  (rc)));..  retur
17a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
17a10 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
17a20 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
17a30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
17a40 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
17a50 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
17a60 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
17a70 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
17a80 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
17a90 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
17aa0 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
17ab0 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
17ac0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
17ad0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
17ae0 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
17af0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
17b00 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
17b10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
17b20 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
17b30 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
17b40 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
17b50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
17b60 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
17b70 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
17b80 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
17b90 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
17ba0 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
17bb0 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
17bc0 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c  mNode *p;.  BOOL
17bd0 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20   bRc;.  assert( 
17be0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
17bf0 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ) );.  OSTRACE((
17c00 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25  "SHM-PURGE pid=%
17c10 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25  lu, deleteFlag=%
17c20 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17c30 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
17c40 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65  cessId(), delete
17c50 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26  Flag));.  pp = &
17c60 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
17c70 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
17c80 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
17c90 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
17ca0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
17cb0 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
17cc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
17cd0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
17ce0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17cf0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
17d00 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
17d10 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
17d20 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
17d30 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
17d40 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
17d50 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
17d60 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
17d70 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
17d80 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
17d90 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
17da0 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
17db0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
17dc0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
17dd0 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
17de0 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
17df0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17e00 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20  SHM-PURGE-CLOSE 
17e10 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
17e20 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
17e40 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
17e50 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
17e60 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
17e70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
17e80 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
17e90 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
17ea0 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
17eb0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
17ec0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
17ed0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
17ee0 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
17ef0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
17f00 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
17f10 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
17f20 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
17f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17f40 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
17f50 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
17f60 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17f80 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
17f90 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
17fa0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
17fb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
17fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
17fd0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
17fe0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
17ff0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18010 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
18020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18030 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
18040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18050 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
18060 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
18070 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
18080 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
18090 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
180a0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
180b0 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
180c0 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
180d0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
180e0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
180f0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
18100 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
18110 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
18120 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
18130 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
18140 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
18150 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
18160 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
18170 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
18180 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
18190 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
181a0 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
181b0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
181c0 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
181d0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
181e0 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
18210 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
18220 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
18230 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
18240 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
18250 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
18260 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
18270 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18290 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
182a0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
182b0 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
182c0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
182d0 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
182e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
182f0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
18300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18310 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
18320 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
18330 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
18340 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
18350 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
18360 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
18370 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
18380 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
18390 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
183a0 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
183b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
183c0 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
183d0 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
183e0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
183f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18400 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
18410 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
18420 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18430 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65  R_NOMEM;.  nName
18440 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18450 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
18460 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
18470 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
18480 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
18490 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
184a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
184b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
184c0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
184d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
184e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  MEM;.  }.  pNew-
184f0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
18500 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
18510 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18520 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
18530 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
18540 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
18550 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
18560 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
18570 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
18580 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a  ilename); ..  /*
18590 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
185a0 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
185b0 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
185c0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
185d0 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
185e0 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
185f0 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
18600 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
18610 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
18620 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
18630 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
18640 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
18650 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
18660 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
18670 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
18680 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
18690 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
186a0 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
186b0 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
186c0 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
186d0 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
186e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
186f0 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
18700 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
18710 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
18720 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
18730 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
18740 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18750 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
18760 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  lse{.    pShmNod
18770 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e  e = pNew;.    pN
18780 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69  ew = 0;.    ((wi
18790 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64  nFile*)(&pShmNod
187a0 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20  e->hFile))->h = 
187b0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
187c0 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ALUE;.    pShmNo
187d0 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53  de->pNext = winS
187e0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20  hmNodeList;.    
187f0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
18800 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20   pShmNode;..    
18810 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
18820 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
18830 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
18840 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
18850 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
18860 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
18870 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
18880 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
18890 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
188a0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
188b0 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
188c0 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
188d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
188e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
188f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18900 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
18910 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
18920 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
18930 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
18940 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
18950 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
18980 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
18990 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
189a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20  E_OPEN_CREATE,. 
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
189d0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
189e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
189f0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
18a00 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
18a10 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
18a20 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
18a30 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
18a40 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
18a50 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
18a60 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
18a70 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
18a80 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
18a90 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
18aa0 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
18ab0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
18ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18ad0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
18ae0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
18af0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
18b00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
18b10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18b20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
18b30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
18b40 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
18b50 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18b60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18b70 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
18b80 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
18b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
18bc0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
18bd0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
18be0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
18bf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
18c00 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
18c10 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
18c20 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
18c30 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
18c40 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
18c50 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
18c60 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
18c70 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
18c80 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
18c90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
18ca0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
18cb0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
18cc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
18cd0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
18ce0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
18cf0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
18d00 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
18d10 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
18d20 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
18d30 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
18d40 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
18d50 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
18d60 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
18d70 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
18d80 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
18d90 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
18da0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
18db0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
18dc0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
18dd0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
18de0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
18df0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
18e00 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
18e10 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
18e20 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
18e30 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
18e40 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
18e50 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
18e60 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
18e70 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
18e80 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
18e90 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
18ea0 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
18eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
18ec0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
18ed0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
18ee0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
18ef0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
18f00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
18f10 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
18f20 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
18f30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
18f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18f50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
18f60 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
18f70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
18f80 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18f90 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
18fa0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
18fb0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
18fc0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
18fd0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
18fe0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
18ff0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
19000 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
19010 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
19020 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
19030 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
19040 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
19050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
19060 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
19070 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
19080 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
19090 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
190a0 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
190b0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
190c0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
190d0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
190e0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
190f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
19100 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
19110 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
19120 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
19130 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
19140 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
19150 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
19160 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
19170 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
19180 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
19190 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
191a0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
191b0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
191c0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
191d0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
191e0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
191f0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
19200 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
19210 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
19220 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
19230 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
19240 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
19250 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
19260 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
19270 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
19280 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
19290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
192a0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
192b0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
192c0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
192d0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
192e0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
192f0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
19300 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
19310 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19320 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
19330 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
19340 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
19350 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
19360 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
19370 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
19380 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
19390 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
193a0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
193b0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
193c0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
193d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
193e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
193f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
19400 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
19410 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
19420 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
19430 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
19440 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
19450 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
19460 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
19470 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
19480 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
19490 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
194a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
194b0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
194c0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
194d0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
194e0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
194f0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
19500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19510 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
19520 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
19530 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
19540 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
19550 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
19560 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
19570 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
19580 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
19590 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
195a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
195b0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195d0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
195e0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
195f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
19620 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
19630 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
19640 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
19650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
19660 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
19670 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
19680 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
19690 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
196a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
196b0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
196c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
196d0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
196e0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
196f0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
19700 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
19710 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
19720 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
19750 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
19760 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
19770 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
19780 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
19790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
197c0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197f0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
19800 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
19810 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
19820 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
19830 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
19840 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
19850 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
19860 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
19870 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
19880 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
19890 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
198a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
198b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
198c0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
198d0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
198e0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
198f0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
19900 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
19910 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
19920 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
19930 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
19940 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
19950 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
19960 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
19970 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
19980 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
19990 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
199a0 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
199b0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
199c0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
199d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
199e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
199f0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
19a00 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
19a10 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
19a20 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
19a30 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
19a40 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
19a50 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
19a60 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
19a70 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
19a80 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
19a90 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
19aa0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
19ab0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
19ac0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
19ad0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
19ae0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
19af0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
19b00 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
19b10 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
19b20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
19b30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
19b40 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
19b50 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
19b60 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
19b70 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
19b80 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
19b90 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
19ba0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
19bb0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
19bc0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
19bd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19be0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
19bf0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
19c00 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
19c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
19c30 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
19c40 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
19c50 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
19c60 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
19c70 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
19c80 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
19c90 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
19ca0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
19cb0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
19cc0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
19cd0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
19ce0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
19cf0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
19d00 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
19d10 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
19d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
19d30 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
19d40 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
19d50 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
19d60 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
19d70 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
19d80 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
19d90 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
19da0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
19db0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
19dc0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
19dd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
19de0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
19df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
19e00 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
19e10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19e20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
19e30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
19e40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
19e50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
19e60 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
19e70 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
19e80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
19e90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19ea0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
19eb0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
19ec0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
19ed0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
19ee0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
19ef0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
19f00 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
19f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
19f20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19f30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19f40 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
19f50 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
19f60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
19f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19f80 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
19f90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
19fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
19fb0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
19fc0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
19fd0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
19fe0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
19ff0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1a000 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1a010 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1a020 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1a030 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1a040 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1a050 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1a060 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1a070 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1a080 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1a090 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1a0a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1a0b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1a0c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a0d0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1a0e0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
1a0f0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
1a100 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
1a110 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
1a120 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
1a130 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
1a140 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
1a150 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
1a160 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1a170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a180 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1a190 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1a1a0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
1a1b0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1a1c0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1a1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1a1f0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
1a200 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
1a210 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1a220 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
1a230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1a240 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a250 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1a260 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1a270 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c  HM-LOCK pid=%lu,
1a280 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61   id=%d, sharedMa
1a290 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73  sk=%03x, exclMas
1a2a0 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22  k=%03x, rc=%s\n"
1a2b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1a2c0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1a2d0 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e  Id(), p->id, p->
1a2e0 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
1a2f0 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20  xclMask,.       
1a300 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61      sqlite3ErrNa
1a310 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
1a320 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a330 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
1a340 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
1a350 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
1a360 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
1a370 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1a380 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1a390 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1a3a0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1a3b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1a3c0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1a3d0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1a3e0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1a3f0 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
1a400 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
1a410 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
1a420 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1a430 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1a440 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
1a450 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a460 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
1a470 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
1a480 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
1a490 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
1a4a0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
1a4b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
1a4c0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1a4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a4e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1a4f0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
1a500 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
1a510 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
1a520 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1a530 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a550 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1a560 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
1a570 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1a580 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1a590 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1a5a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1a5b0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
1a5c0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
1a5d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a5e0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1a5f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1a600 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
1a610 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
1a620 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
1a630 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
1a640 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
1a650 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1a660 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
1a670 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1a680 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
1a690 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
1a6a0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
1a6b0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
1a6c0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
1a6d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
1a6e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1a6f0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
1a700 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1a710 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
1a720 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1a730 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
1a740 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
1a750 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
1a760 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
1a770 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
1a780 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
1a790 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1a7a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
1a7b0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
1a7c0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
1a7d0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
1a7e0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
1a7f0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
1a800 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1a810 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
1a820 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
1a830 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
1a840 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1a850 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
1a860 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
1a870 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1a880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a890 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
1a8a0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8c0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
1a8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1a8e0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
1a910 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
1a920 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a940 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
1a950 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
1a960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a970 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1a980 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
1a990 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
1a9a0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9c0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
1a9d0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
1a9e0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1a9f0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
1aa00 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1aa10 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
1aa20 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
1aa30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1aa40 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
1aa50 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
1aa60 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
1aa70 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
1aa80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1aa90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
1aaa0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1aab0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
1aac0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1aad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1aae0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1aaf0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1ab00 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1ab10 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1ab20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ab30 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
1ab40 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1ab50 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1ab60 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1ab70 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
1ab80 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
1ab90 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1aba0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1abb0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1abc0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1abd0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1abe0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
1abf0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ac10 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
1ac20 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
1ac30 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1ac40 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1ac50 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1ac60 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1ac70 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1ac80 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1ac90 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1aca0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1acb0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1acc0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1acd0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1ace0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1acf0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1ad00 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1ad10 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1ad20 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1ad30 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1ad40 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1ad50 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1ad60 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1ad70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ad80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1ad90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ada0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1adb0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1adc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1add0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
1ade0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1adf0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1ae00 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
1ae10 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
1ae20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
1ae30 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1ae40 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
1ae50 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
1ae60 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
1ae70 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
1ae80 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1ae90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1aea0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1aeb0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
1aec0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
1aed0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
1aee0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
1aef0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1af00 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1af10 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1af20 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
1af30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1af40 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
1af50 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1af60 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1af70 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1af80 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1af90 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
1afa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1afb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1afc0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1afd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1afe0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1aff0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1b010 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
1b020 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1b030 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1b040 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1b050 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1b060 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1b070 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1b080 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1b090 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1b0a0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
1b0b0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1b0c0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1b0d0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
1b0e0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
1b0f0 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
1b100 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
1b110 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1b120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b130 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b140 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1b150 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1b160 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1b170 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
1b180 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
1b190 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1b1a0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
1b1b0 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c  ANDLE hMap = NUL
1b1c0 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  L;         /* fi
1b1d0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
1b1e0 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
1b1f0 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
1b200 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
1b210 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
1b220 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  /.     .#if SQLI
1b230 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1b240 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1b250 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1b260 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
1b270 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1b280 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1b290 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
1b2a0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1b2b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b2c0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1b2d0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1b2e0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1b2f0 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gW(pShmNode->hFi
1b300 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
1b310 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1b320 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1b330 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1b340 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1b350 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1b360 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  SI).      hMap =
1b370 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1b380 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingA(pShmNode->
1b390 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
1b3a0 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1b3b0 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
1b3c0 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1b3d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1b3e0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1b3f0 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1b400 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65   region=%d, size
1b410 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1b430 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1b440 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1b450 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
1b460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b470 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
1b480 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1b490 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
1b4a0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
1b4b0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
1b4c0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1b4d0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1b4e0 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
1b4f0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1b500 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
1b510 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
1b520 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1b530 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1b540 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
1b550 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1b560 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1b570 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1b580 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
1b590 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1b5a0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1b5b0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1b5c0 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
1b5d0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1b5e0 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
1b5f0 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1b600 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1b610 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
1b620 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1b630 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1b640 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1b650 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1b660 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1b670 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  MAP-MAP pid=%lu,
1b680 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73   region=%d, offs
1b690 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  et=%d, size=%d, 
1b6a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1b6b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1b6c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1b6d0 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1b6e0 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a  egion, iOffset,.
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20   szRegion, pMap 
1b710 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1b720 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
1b730 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
1b740 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1b750 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1b760 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1b770 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1b780 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b790 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53  IOERR_SHMMAP, pS
1b7a0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
1b7b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1b7c0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22      "winShmMap3"
1b7d0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1b7e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
1b7f0 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  p ) osCloseHandl
1b800 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  e(hMap);.       
1b810 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1b820 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1b830 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1b840 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1b850 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d  egion].pMap = pM
1b860 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1b870 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1b880 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68  Node->nRegion].h
1b890 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20  Map = hMap;.    
1b8a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
1b8b0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
1b8c0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
1b8d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1b8e0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
1b8f0 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  {.    int iOffse
1b900 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65  t = iRegion*szRe
1b910 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f  gion;.    int iO
1b920 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
1b930 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
1b940 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
1b950 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63  anularity;.    c
1b960 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
1b970 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69  )pShmNode->aRegi
1b980 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  on[iRegion].pMap
1b990 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69  ;.    *pp = (voi
1b9a0 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68  d *)&p[iOffsetSh
1b9b0 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ift];.  }else{. 
1b9c0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
1b9d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b9e0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1b9f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1ba00 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20   rc;.}..#else.# 
1ba10 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70  define winShmMap
1ba20 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
1ba30 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  winShmLock    0.
1ba40 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42  # define winShmB
1ba50 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
1ba60 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20  e winShmUnmap   
1ba70 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
1ba80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ba90 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c  WAL */../*.** Cl
1baa0 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70  eans up the mapp
1bab0 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65  ed region of the
1bac0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
1bad0 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20   if any..*/.#if 
1bae0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1baf0 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
1bb00 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77  t winUnmapfile(w
1bb10 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
1bb20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
1bb30 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1bb40 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1bb50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1bb60 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67  hMap=%p, pMapReg
1bb70 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1bb80 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25       "mmapSize=%
1bb90 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74  lld, mmapSizeAct
1bba0 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ual=%lld, mmapSi
1bbb0 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20  zeMax=%lld\n",. 
1bbc0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1bbd0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1bbe0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1bbf0 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d  >hMap, pFile->pM
1bc00 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  apRegion,.      
1bc10 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1bc20 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  Size, pFile->mma
1bc30 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69  pSizeActual, pFi
1bc40 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29  le->mmapSizeMax)
1bc50 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1bc60 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
1bc70 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69    if( !osUnmapVi
1bc80 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
1bc90 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20  pMapRegion) ){. 
1bca0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1bcb0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1bcc0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1bcd0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1bce0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1bcf0 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  ile=%p, pMapRegi
1bd00 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1bd10 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49          "rc=SQLI
1bd20 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1bd30 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
1bd40 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1bd50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bd60 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1bd70 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  on));.      retu
1bd80 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1bd90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1bda0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1bdb0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1bdd0 6e 55 6e 6d 61 70 31 22 2c 20 70 46 69 6c 65 2d  nUnmap1", pFile-
1bde0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1bdf0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1be00 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46  gion = 0;.    pF
1be10 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1be20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
1be30 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
1be40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
1be50 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b  e->hMap!=NULL ){
1be60 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73  .    if( !osClos
1be70 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
1be80 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46  Map) ){.      pF
1be90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1bea0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1beb0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1bec0 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1bed0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1bee0 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c   hMap=%p, rc=SQL
1bef0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1bf00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bf10 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1bf20 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1bf30 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b  , pFile->hMap));
1bf40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
1bf50 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1bf60 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
1bf70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
1bfa0 70 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  p2", pFile->zPat
1bfb0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1bfc0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
1bfd0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
1bfe0 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1bff0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1c000 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1c010 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1c020 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1c030 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
1c040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
1c060 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
1c070 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
1c080 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
1c090 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
1c0a0 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
1c0b0 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
1c0c0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
1c0d0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
1c0e0 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
1c0f0 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
1c100 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
1c110 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1c120 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
1c130 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
1c140 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
1c150 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
1c160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c170 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1c180 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
1c190 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
1c1a0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
1c1b0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
1c1c0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
1c1d0 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
1c1e0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
1c1f0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
1c200 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
1c210 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
1c220 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
1c230 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1c240 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
1c250 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
1c260 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
1c270 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
1c280 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
1c290 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
1c2a0 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
1c2b0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1c2c0 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ZE, whichever is
1c2d0 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
1c2e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c2f0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
1c300 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
1c310 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
1c320 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
1c330 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
1c340 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1c350 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
1c360 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1c370 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1c380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1c390 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  Mapfile(winFile 
1c3a0 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pFd, sqlite3_in
1c3b0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71  t64 nByte){.  sq
1c3c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70  lite3_int64 nMap
1c3d0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20   = nByte;.  int 
1c3e0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1c3f0 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
1c400 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
1c410 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1c420 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c430 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
1c440 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c450 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1c460 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42  essId(), pFd, nB
1c470 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46  yte));..  if( pF
1c480 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
1c490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c4a0 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
1c4b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1c4c0 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1c4d0 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d  3_file*)pFd, &nM
1c4e0 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ap);.    if( rc 
1c4f0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1c500 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
1c510 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1c520 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  c=SQLITE_IOERR_F
1c530 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20  STAT\n",.       
1c540 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1c550 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1c560 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65   pFd));.      re
1c570 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c580 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
1c590 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46   }.  if( nMap>pF
1c5a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
1c5b0 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64  {.    nMap = pFd
1c5c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1c5d0 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73   }.  nMap &= ~(s
1c5e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69  qlite3_int64)(wi
1c5f0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1c600 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66  ize - 1);. .  if
1c610 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
1c620 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1c630 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1c640 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
1c650 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
1c660 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
1c670 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
1c680 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
1c690 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
1c6a0 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
1c6b0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
1c6c0 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
1c6d0 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20  e(pFd);.    if( 
1c6e0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
1c6f0 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  & WINFILE_RDONLY
1c700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
1c710 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1c720 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c  DWRITE;.      fl
1c730 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f  ags |= FILE_MAP_
1c740 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66  WRITE;.    }.#if
1c750 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1c760 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1c770 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1c780 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d  pingFromApp(pFd-
1c790 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1c7a0 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a  t, nMap, NULL);.
1c7b0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1c7c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1c7d0 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d  IDE).    pFd->hM
1c7e0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1c7f0 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68  eMappingW(pFd->h
1c800 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1c810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e   (DWORD)((nMap>>
1c840 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66  32) & 0xffffffff
1c850 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20     (DWORD)(nMap 
1c880 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e  & 0xffffffff), N
1c890 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  ULL);.#elif defi
1c8a0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1c8b0 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70  _HAS_ANSI).    p
1c8c0 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
1c8d0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
1c8e0 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1c8f0 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  otect,.         
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28         (DWORD)((
1c920 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66  nMap>>32) & 0xff
1c930 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20  ffffff),.       
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1c960 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66  (nMap & 0xffffff
1c970 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ff), NULL);.#end
1c980 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  if.    if( pFd->
1c990 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap==NULL ){.  
1c9a0 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1c9b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1c9c0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1c9d0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1c9e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1c9f0 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
1ca00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ca10 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1ca20 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  ile", pFd->zPath
1ca30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1ca40 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1ca50 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1ca60 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1ca70 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1ca80 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1ca90 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
1caa0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1cab0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
1cac0 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20  R_MMAP\n",.     
1cad0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1cae0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1caf0 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20  ), pFd));.      
1cb00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cb10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1cb20 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53  rt( (nMap % winS
1cb30 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1cb40 65 29 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c  e)==0 );.#if SQL
1cb50 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1cb60 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
1cb70 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
1cb80 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1cb90 20 30 2c 20 6e 4d 61 70 29 3b 0a 23 65 6c 73 65   0, nMap);.#else
1cba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1cbb0 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a  eof(SIZE_T)==siz
1cbc0 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
1cbd0 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66  4) || nMap<=0xff
1cbe0 66 66 66 66 66 66 20 29 3b 0a 20 20 20 20 70 4e  ffffff );.    pN
1cbf0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1cc00 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20  File(pFd->hMap, 
1cc10 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49  flags, 0, 0, (SI
1cc20 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64  ZE_T)nMap);.#end
1cc30 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  if.    if( pNew=
1cc40 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f  =NULL ){.      o
1cc50 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64  sCloseHandle(pFd
1cc60 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70  ->hMap);.      p
1cc70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  Fd->hMap = NULL;
1cc80 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
1cc90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1cca0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1ccb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ccc0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1ccd0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70   "winMapfile", p
1cd00 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1cd10 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1cd20 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
1cd30 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1cd40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1cd50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cd60 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1cd70 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1cd80 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1cd90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cda0 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  }.    pFd->pMapR
1cdb0 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20  egion = pNew;.  
1cdc0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
1cdd0 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d  = nMap;.    pFd-
1cde0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
1cdf0 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f  = nMap;.  }..  O
1ce00 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1ce10 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1ce20 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1ce30 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1ce40 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ce50 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1ce60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ce70 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1ce80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ce90 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
1cea0 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1ceb0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1cec0 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
1ced0 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67  file fd starting
1cee0 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f   at offset.** iO
1cef0 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20  ff. The mapping 
1cf00 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f  must be valid fo
1cf10 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20  r at least nAmt 
1cf20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bytes..**.** If 
1cf30 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63  such a pointer c
1cf40 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  an be obtained, 
1cf50 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20  store it in *pp 
1cf60 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1cf70 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  E_OK..** Or, if 
1cf80 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e  one cannot but n
1cf90 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1cfa0 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64  set *pp to 0 and
1cfb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cfc0 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  K..** Finally, i
1cfd0 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
1cfe0 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e  occur, return an
1cff0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1d000 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a  de. The final.**
1d010 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73   value of *pp is
1d020 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
1d030 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
1d040 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1d050 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f  does return a po
1d060 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65  inter, the calle
1d070 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c  r must eventuall
1d080 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  y .** release th
1d090 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
1d0a0 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
1d0b0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
1d0c0 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
1d0d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
1d0e0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
1d0f0 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
1d100 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1d110 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
1d120 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
1d130 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
1d140 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1d150 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
1d160 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
1d170 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
1d180 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1d190 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
1d1a0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
1d1b0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
1d1c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1d1d0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
1d1e0 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
1d1f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1d200 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1d210 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
1d220 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
1d230 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
1d240 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1d250 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
1d260 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
1d270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
1d290 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1d2a0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d2b0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1d2d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d2e0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1d2f0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1d300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d310 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1d320 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
1d330 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
1d340 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
1d350 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
1d360 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
1d370 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
1d380 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
1d390 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
1d3a0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
1d3b0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1d3c0 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
1d3d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1d3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1d3f0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1d400 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
1d410 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
1d420 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d430 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
1d440 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
1d450 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
1d460 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
1d470 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
1d480 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
1d490 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
1d4a0 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20  winFetch(). The 
1d4b0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
1d4c0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1d4d0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
1d4e0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1d4f0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1d500 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
1d510 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
1d520 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69  the winFetch() i
1d530 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
1d540 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
1d550 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
1d560 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
1d570 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
1d580 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
1d590 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
1d5a0 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
1d5b0 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
1d5c0 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
1d5d0 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
1d5e0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
1d5f0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
1d600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d610 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
1d620 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
1d630 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
1d640 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1d650 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
1d660 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
1d670 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
1d680 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
1d690 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d6a0 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
1d6b0 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
1d6c0 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
1d6d0 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
1d6e0 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46  tanding .  ** xF
1d6f0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e  etch references.
1d700 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65   Or, if p!=0 (me
1d710 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78  aning it is an x
1d720 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29  Fetch reference)
1d730 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
1d740 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
1d750 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
1d760 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ng.  */.  assert
1d770 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e  ( (p==0)==(pFd->
1d780 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b  nFetchOut==0) );
1d790 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20  ..  /* If p!=0, 
1d7a0 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  it must match th
1d7b0 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f  e iOff value. */
1d7c0 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1d7d0 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46  || p==&((u8 *)pF
1d7e0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
1d7f0 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41  Off] );..  OSTRA
1d800 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
1d810 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1d820 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25  offset=%lld, p=%
1d830 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
1d840 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d850 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69  cessId(), pFd, i
1d860 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28  Off, p));..  if(
1d870 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
1d880 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
1d890 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d  lse{.    /* FIXM
1d8a0 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74  E:  If Windows t
1d8b0 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76  ruly always prev
1d8c0 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20  ents truncating 
1d8d0 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20  or deleting a.  
1d8e0 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20    ** file while 
1d8f0 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c  a mapping is hel
1d900 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  d, then the foll
1d910 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69  owing winUnmapfi
1d920 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  le() call.    **
1d930 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
1d940 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  can can be omitt
1d950 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  ed - potentially
1d960 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a   improving.    *
1d970 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  * performance.  
1d980 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  */.    winUnmapf
1d990 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20  ile(pFd);.  }.. 
1d9a0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
1d9b0 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65  etchOut>=0 );.#e
1d9c0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
1d9d0 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c  ("UNFETCH pid=%l
1d9e0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1d9f0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1da00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1da10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1da20 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e  , fd));.  return
1da30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1da40 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
1da50 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1da60 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
1da70 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
1da80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1da90 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
1daa0 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
1dab0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
1dac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dad0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1dae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1daf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db20 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
1db30 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
1db40 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
1db50 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
1db60 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
1db70 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
1db80 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
1db90 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1dba0 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
1dbb0 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  {.  3,          
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1dbe0 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
1dc10 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
1dc40 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
1dc70 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
1dca0 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
1dcd0 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
1dd00 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20  .  winLock,     
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
1dd30 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   winUnlock,     
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
1dd60 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
1dd70 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  dLock,          
1dd80 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
1dd90 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
1dda0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ddc0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
1ddd0 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
1de00 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
1de10 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
1de20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
1de30 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
1de40 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
1de70 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
1dea0 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
1deb0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1dec0 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
1ded0 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
1dee0 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1df00 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65  Unmap */.  winFe
1df10 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
1df20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1df30 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66  etch */.  winUnf
1df40 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  etch            
1df50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1df60 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  fetch */.};../**
1df70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dfb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1dfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dfd0 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
1dfe0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
1dff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e000 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
1e010 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
1e020 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
1e030 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
1e040 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
1e050 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
1e060 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ..*/../*.** Conv
1e070 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
1e080 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
1e090 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
1e0a0 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
1e0b0 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
1e0c0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
1e0d0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1e0e0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
1e0f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1e100 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
1e110 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1e120 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
1e130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e140 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c   *convertUtf8Fil
1e150 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
1e160 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1e170 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1e180 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54   = 0;.  if( isNT
1e190 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
1e1a0 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69  rted = utf8ToUni
1e1b0 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
1e1c0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1e1d0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1e1e0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43  I.  else{.    zC
1e1f0 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
1e200 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
1e210 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29  _mbcs(zFilename)
1e220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  ;.  }.#endif.  /
1e230 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
1e240 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
1e250 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
1e260 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a  Converted;.}../*
1e270 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
1e280 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
1e290 62 79 74 65 73 29 20 66 6f 72 20 77 69 6e 64 6f  bytes) for windo
1e2a0 77 73 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54  ws.  The MAX_PAT
1e2b0 48 20 6d 61 63 72 6f 20 69 73 0a 2a 2a 20 69 6e  H macro is.** in
1e2c0 20 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20   characters, so 
1e2d0 77 65 20 61 6c 6c 6f 63 61 74 65 20 33 20 62 79  we allocate 3 by
1e2e0 74 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65  tes per characte
1e2f0 72 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74  r assuming worst
1e300 2d 63 61 73 65 0a 2a 2a 20 33 2d 62 79 74 65 73  -case.** 3-bytes
1e310 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72 20 55  -per-character U
1e320 54 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  TF8..*/.#ifndef 
1e330 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1e340 5f 50 41 54 48 0a 23 20 20 64 65 66 69 6e 65 20  _PATH.#  define 
1e350 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1e360 5f 50 41 54 48 20 20 20 28 4d 41 58 5f 50 41 54  _PATH   (MAX_PAT
1e370 48 2a 33 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  H*3).#endif../*.
1e380 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1e390 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1e3a0 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1e3b0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1e3c0 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1e3d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e3e0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e3f0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1e400 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1e410 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1e420 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1e430 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1e440 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1e450 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1e460 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1e470 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1e480 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1e490 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1e4a0 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61  nTempPath;.  cha
1e4b0 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49  r zTempPath[SQLI
1e4c0 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1e4d0 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  H+2];..  /* It's
1e4e0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1e4f0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1e500 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1e510 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1e520 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1e530 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1e540 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1e550 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1e560 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1e570 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
1e580 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e590 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1e5a0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d  _IOERR );..  mem
1e5b0 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30  set(zTempPath, 0
1e5c0 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  , SQLITE_WIN32_M
1e5d0 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69  AX_PATH+2);..  i
1e5e0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
1e5f0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
1e600 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1e610 66 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f(SQLITE_WIN32_M
1e620 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
1e630 70 50 61 74 68 2c 20 22 25 73 22 2c 0a 20 20 20  pPath, "%s",.   
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
1e660 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23  irectory);.  }.#
1e670 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1e680 4e 52 54 0a 20 20 65 6c 73 65 20 69 66 28 20 69  NRT.  else if( i
1e690 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
1e6a0 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
1e6b0 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d  CHAR zWidePath[M
1e6c0 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 69 66  AX_PATH];.    if
1e6d0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  ( osGetTempPathW
1e6e0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57  (MAX_PATH-30, zW
1e6f0 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
1e700 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1e710 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1e720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
1e730 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
1e740 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e750 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
1e760 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
1e770 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
1e780 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
1e790 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
1e7a0 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
1e7b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 53 51 4c 49  e3_snprintf(SQLI
1e7c0 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1e7d0 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
1e7e0 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
1e7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1e800 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
1e810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54  }else{.      OST
1e820 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1e830 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
1e840 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
1e850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e860 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
1e880 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e890 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1e8a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
1e8b0 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
1e8c0 50 61 74 68 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Path[SQLITE_WIN3
1e8d0 32 5f 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  2_MAX_PATH];.   
1e8e0 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
1e8f0 74 68 41 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  thA(SQLITE_WIN32
1e900 5f 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  _MAX_PATH-30, zM
1e910 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
1e920 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1e930 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1e940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
1e950 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
1e960 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e970 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
1e980 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
1e990 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
1e9a0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
1e9b0 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
1e9c0 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
1e9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1e9e0 70 72 69 6e 74 66 28 53 51 4c 49 54 45 5f 57 49  printf(SQLITE_WI
1e9f0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 2d 33 30 2c  N32_MAX_PATH-30,
1ea00 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
1ea10 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
1ea20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
1ea30 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
1ea40 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ea50 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
1ea60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
1ea70 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
1ea80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ea90 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1eaa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
1eab0 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
1eac0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
1ead0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
1eae0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
1eaf0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
1eb00 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
1eb10 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
1eb20 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
1eb30 0a 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73  .  nTempPath = s
1eb40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1eb50 54 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66  TempPath);..  if
1eb60 28 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73  ( (nTempPath + s
1eb70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
1eb80 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1eb90 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
1eba0 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54   nBuf ){.    OST
1ebb0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1ebc0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
1ebd0 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
1ebe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1ebf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  OR;.  }..  for(i
1ec00 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20  =nTempPath; i>0 
1ec10 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31  && zTempPath[i-1
1ec20 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a  ]=='\\'; i--){}.
1ec30 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d    zTempPath[i] =
1ec40 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   0;..  sqlite3_s
1ec50 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c  nprintf(nBuf-18,
1ec60 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74   zBuf, (nTempPat
1ec70 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20  h > 0) ?.       
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
1eca0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20  P_FILE_PREFIX : 
1ecb0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
1ecc0 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20  _PREFIX,.       
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
1ece0 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71  pPath);.  j = sq
1ecf0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
1ed00 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
1ed10 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
1ed20 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
1ed30 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
1ed40 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
1ed50 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
1ed60 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
1ed70 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
1ed80 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
1ed90 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
1eda0 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
1edb0 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   0;..  OSTRACE((
1edc0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e  "TEMP-FILENAME n
1edd0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
1ede0 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  E_OK\n", zBuf));
1edf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ee00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
1ee10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1ee20 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72   named file is r
1ee30 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
1ee40 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  y.  Return false
1ee50 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d   if.** it is som
1ee60 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1ee70 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f  n a directory, o
1ee80 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  r if there is an
1ee90 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79  y kind of memory
1eea0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  .** allocation f
1eeb0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1eec0 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
1eed0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  onst void *zConv
1eee0 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20  erted){.  DWORD 
1eef0 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
1ef00 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
1ef10 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73  Errno;..  if( is
1ef20 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
1ef30 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
1ef40 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
1ef50 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
1ef60 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
1ef70 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
1ef80 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
1ef90 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
1efa0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1efb0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
1efc0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
1eff0 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
1f000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1f020 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72  sAttrData)) && r
1f030 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1f040 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1f050 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
1f060 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
1f070 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20  * Invalid name? 
1f080 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74  */.    }.    att
1f090 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
1f0a0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
1f0b0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1f0c0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
1f0d0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
1f0e0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1f0f0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1f100 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
1f110 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49   return (attr!=I
1f120 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1f130 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72  IBUTES) && (attr
1f140 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
1f150 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f  DIRECTORY);.}../
1f160 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1f170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f180 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
1f190 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1f1a0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
1f1b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1f1c0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
1f1d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1f1e0 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
1f1f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1f200 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
1f210 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
1f220 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1f230 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
1f260 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
1f270 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1f280 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
1f290 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
1f2a0 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
1f2b0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44  D lastErrno;.  D
1f2c0 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
1f2d0 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
1f2e0 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
1f2f0 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
1f300 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
1f310 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
1f320 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
1f330 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1f340 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
1f350 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
1f360 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
1f370 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
1f380 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
1f390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1f3a0 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
1f3b0 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
1f3c0 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
1f3d0 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
1f3e0 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
1f3f0 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
1f400 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
1f410 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
1f420 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
1f430 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
1f440 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
1f450 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
1f460 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
1f470 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
1f480 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1f490 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
1f4a0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 53 51  char zTmpname[SQ
1f4b0 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
1f4c0 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42  ATH+2];     /* B
1f4d0 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
1f4e0 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
1f4f0 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  me */..  int rc 
1f500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1f510 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
1f520 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
1f530 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1f540 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
1f550 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
1f560 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
1f570 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
1f580 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
1f590 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
1f5a0 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
1f5b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1f5c0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1f5d0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
1f5e0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
1f5f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
1f600 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
1f610 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
1f620 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1f630 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1f640 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
1f650 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
1f660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f670 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
1f680 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
1f690 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1f6a0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
1f6b0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
1f6c0 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
1f6d0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
1f6e0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
1f6f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
1f700 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
1f710 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1f720 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1f730 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
1f740 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f750 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
1f760 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  f..  OSTRACE(("O
1f770 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69  PEN name=%s, pFi
1f780 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
1f790 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22   pOutFlags=%p\n"
1f7a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74  ,.           zUt
1f7b0 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67  f8Name, id, flag
1f7c0 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a  s, pOutFlags));.
1f7d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
1f7e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
1f7f0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
1f800 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
1f810 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
1f820 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
1f830 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
1f840 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
1f850 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
1f860 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
1f870 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
1f880 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
1f890 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
1f8a0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
1f8b0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
1f8c0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
1f8d0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
1f8e0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
1f8f0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
1f900 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
1f910 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
1f920 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
1f930 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
1f940 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
1f950 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
1f960 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
1f970 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
1f980 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
1f990 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
1f9a0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
1f9b0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
1f9c0 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
1f9d0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
1f9e0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
1f9f0 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
1fa00 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
1fa10 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
1fa20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
1fa30 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
1fa40 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
1fa50 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
1fa60 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
1fa70 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
1fa80 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
1fa90 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
1faa0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
1fab0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
1fac0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
1fad0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1fae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
1faf0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1fb00 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1fb10 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1fb20 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
1fb30 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1fb40 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1fb50 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1fb60 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
1fb70 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
1fb80 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
1fb90 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
1fba0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
1fbb0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
1fbc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1fbd0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
1fbe0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1fbf0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
1fc00 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1fc10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1fc20 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
1fc30 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1fc40 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
1fc50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1fc60 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1fc70 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1fc80 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1fc90 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
1fca0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1fcb0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1fcc0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
1fcd0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
1fce0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1fcf0 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
1fd00 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
1fd10 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
1fd20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
1fd30 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1fd40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1fd50 57 49 4e 52 54 0a 20 20 69 66 28 20 21 73 71 6c  WINRT.  if( !sql
1fd60 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1fd70 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
1fd80 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
1fd90 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71  ROR,.        "sq
1fda0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1fdb0 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68  tory variable sh
1fdc0 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20  ould be set for 
1fdd0 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e  WinRT");.  }.#en
1fde0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
1fdf0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1fe00 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1fe10 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
1fe20 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  ate a .  ** temp
1fe30 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1fe40 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69  to use .  */.  i
1fe50 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b  f( !zUtf8Name ){
1fe60 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
1fe70 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a  lete && !isOpenJ
1fe80 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 6d 65 6d  ournal);.    mem
1fe90 73 65 74 28 7a 54 6d 70 6e 61 6d 65 2c 20 30 2c  set(zTmpname, 0,
1fea0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
1feb0 58 5f 50 41 54 48 2b 32 29 3b 0a 20 20 20 20 72  X_PATH+2);.    r
1fec0 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
1fed0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1fee0 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d  _PATH+2, zTmpnam
1fef0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ff00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ff10 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1ff20 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  N name=%s, rc=%s
1ff30 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71  ", zUtf8Name, sq
1ff40 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1ff50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ff60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
1ff70 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
1ff80 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
1ff90 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
1ffa0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
1ffb0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
1ffc0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a  they are not.  *
1ffd0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
1ffe0 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
1fff0 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
20000 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
20010 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
20020 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a  parameter()..  *
20030 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79  /.  assert( (eTy
20040 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
20050 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61  MAIN_DB) || (fla
20060 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
20070 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20  _URI) ||.       
20080 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65   zUtf8Name[strle
20090 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d  n(zUtf8Name)+1]=
200a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  =0 );..  /* Conv
200b0 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
200c0 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
200d0 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
200e0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
200f0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
20100 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
20110 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
20120 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
20130 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
20140 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
20150 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  MEM", zUtf8Name)
20160 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
20170 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20180 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
20190 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
201a0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
201b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
201c0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
201d0 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
201e0 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
201f0 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e  N_ISDIR", zUtf8N
20200 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
20210 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
20220 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20  N_ISDIR;.  }..  
20230 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
20240 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  ){.    dwDesired
20250 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
20260 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
20270 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
20280 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
20290 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
202a0 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51  AD;.  }..  /* SQ
202b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
202c0 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d  IVE is used to m
202d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
202e0 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  new file is .  *
202f0 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
20300 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
20310 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
20320 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20  clusive access" 
20330 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
20340 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
20350 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
20360 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
20370 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
20380 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
20390 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
203a0 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
203b0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
203c0 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
203d0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
203e0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
203f0 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
20400 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
20410 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
20420 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
20430 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
20440 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
20450 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
20460 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
20470 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
20480 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
20490 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
204a0 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
204b0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
204c0 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
204d0 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
204e0 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
204f0 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
20500 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
20510 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
20520 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
20530 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
20540 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
20550 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
20560 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
20570 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
20580 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
20590 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
205a0 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
205b0 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
205e0 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
20610 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
20620 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
20630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
20640 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
20650 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
20660 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
20670 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
20680 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
20690 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
206a0 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
206b0 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
206c0 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
206d0 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
206e0 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
206f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
20700 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
20710 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
20720 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
20730 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
20740 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69  if( isNT() ){.#i
20750 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
20760 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45  T.    CREATEFILE
20770 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
20780 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61  ETERS extendedPa
20790 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78  rameters;.    ex
207a0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
207b0 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  .dwSize = sizeof
207c0 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  (CREATEFILE2_EXT
207d0 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
207e0 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  );.    extendedP
207f0 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
20800 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20  Attributes =.   
20810 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
20820 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
20830 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d  FILE_ATTRIBUTE_M
20840 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
20850 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
20860 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67  leFlags = dwFlag
20870 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
20880 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b   FILE_FLAG_MASK;
20890 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
208a0 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69  ameters.dwSecuri
208b0 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43  tyQosFlags = SEC
208c0 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b  URITY_ANONYMOUS;
208d0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
208e0 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69  ameters.lpSecuri
208f0 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e  tyAttributes = N
20900 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ULL;.    extende
20910 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d  dParameters.hTem
20920 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c  plateFile = NULL
20930 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  ;.    while( (h 
20940 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28  = osCreateFile2(
20950 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
20960 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
20990 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
209e0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
209f0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d    &extendedParam
20a20 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44  eters))==INVALID
20a30 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
20a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20a60 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
20a70 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a90 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
20aa0 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
20ab0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
20ac0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
20ad0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
20b00 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
20b30 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
20b60 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
20b90 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
20ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
20bc0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
20bd0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
20c00 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
20c10 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
20c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20c30 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  oop */.    }.#en
20c40 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
20c50 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
20c60 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
20c70 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
20c80 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
20c90 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
20cc0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
20cf0 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
20d20 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
20d30 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
20d60 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
20d90 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
20da0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dc0 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26      retryIoerr(&
20dd0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
20de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20df0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
20e00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
20e10 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
20e20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
20e30 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
20e40 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
20e50 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
20e60 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
20e70 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
20e80 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
20e90 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
20ea0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
20eb0 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
20ec0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
20ed0 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
20ee0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
20ef0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
20f00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
20f10 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
20f20 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
20f30 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
20f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
20f50 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
20f60 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
20f70 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
20f80 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
20f90 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
20fa0 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
20fb0 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
20fd0 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
20fe0 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
20ff0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
21000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21010 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
21020 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
21030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
21040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
21050 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
21060 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
21070 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
21080 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
21090 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
210a0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
210b0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
210c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
210d0 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
210e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
210f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
21100 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
21110 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
21120 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
21130 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
21140 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
21150 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
21160 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
21170 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
21180 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
21190 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
211a0 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
211b0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
211c0 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
211d0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23  ed" : "ok"));..#
211e0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
211f0 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
21200 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
21210 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21220 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  DB.       && (rc
21230 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f   = winceCreateLo
21240 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
21250 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )!=SQLITE_OK.  )
21260 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
21270 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
21280 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
21290 74 65 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ted);.    OSTRAC
212a0 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b  E(("OPEN-CE-LOCK
212b0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
212c0 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  n", zName, sqlit
212d0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
212e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
212f0 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
21300 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a   ){.    pFile->z
21310 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20  DeleteOnClose = 
21320 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65  zConverted;.  }e
21330 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
21340 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21350 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
21360 0a 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ..  pFile->pMeth
21370 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
21380 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  d;.  pFile->pVfs
21390 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
213a0 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69  ->h = h;.  if( i
213b0 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
213c0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
213d0 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f  s |= WINFILE_RDO
213e0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
213f0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
21400 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
21410 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
21420 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
21430 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
21440 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
21450 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69  _PSOW;.  }.  pFi
21460 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
21470 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c  NO_ERROR;.  pFil
21480 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
21490 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
214a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
214b0 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
214c0 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  L;.  pFile->pMap
214d0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46  Region = 0;.  pF
214e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
214f0 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
21500 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
21510 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
21520 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
21530 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
21540 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
21550 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
21560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21570 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
21580 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
21590 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
215a0 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
215b0 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
215c0 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
215d0 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
215e0 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
215f0 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
21600 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
21610 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
21620 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
21630 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
21640 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
21650 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
21660 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
21670 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
21680 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
21690 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
216a0 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
216b0 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
216c0 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
216d0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
216e0 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
216f0 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
21700 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
21710 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
21720 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
21730 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
21740 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
21750 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
21760 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
21770 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
21780 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
21790 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
217a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
217b0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
217c0 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
217d0 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
217e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
217f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21800 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
21810 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
21840 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
21850 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
21860 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
21870 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
21880 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
21890 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
218a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
218b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
218c0 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
218d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
218e0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
218f0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
21900 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
21910 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63  TE name=%s, sync
21920 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65  Dir=%d\n", zFile
21930 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b  name, syncDir));
21940 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
21950 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
21960 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
21970 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
21980 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
21990 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
219a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
219b0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64   isNT() ){.    d
219c0 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
219d0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
219e0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
219f0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
21a00 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
21a10 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
21a20 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
21a30 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
21a40 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
21a50 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
21a60 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
21a70 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
21aa0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
21ab0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
21ac0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
21ad0 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
21ae0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
21af0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
21b00 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
21b10 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
21b20 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
21b30 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
21b40 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
21b50 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
21b60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21b70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
21b80 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
21b90 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
21ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21bb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21bc0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
21bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
21be0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
21bf0 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
21c00 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
21c10 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
21c20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
21c30 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
21c40 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
21c50 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
21c60 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
21c70 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
21c80 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
21c90 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
21ca0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
21cb0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
21cc0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
21cd0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
21ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
21cf0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
21d00 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
21d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
21d20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
21d30 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
21d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21d60 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
21d70 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
21d80 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
21d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21da0 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
21db0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
21dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21dd0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
21de0 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
21df0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
21e00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21e10 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
21e20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
21e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e40 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72  if ( !retryIoerr
21e50 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
21e60 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
21e70 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
21e80 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
21e90 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
21ea0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21eb0 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
21ec0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21ed0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
21ee0 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b    else{.    do {
21ef0 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
21f00 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
21f10 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sA(zConverted);.
21f20 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
21f30 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
21f40 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
21f50 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
21f60 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
21f80 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
21f90 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
21fa0 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
21fb0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
21fc0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
21fd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21fe0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
21ff0 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
22000 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
22010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22030 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
22040 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22060 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
22070 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
22080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22090 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
220a0 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
220b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
220c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
220d0 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   ( osDeleteFileA
220e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
220f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22100 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
22110 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
22120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22130 0a 20 20 20 20 20 20 69 66 20 28 20 21 72 65 74  .      if ( !ret
22140 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
22150 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
22160 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22170 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
22180 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
22190 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
221a0 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
221b0 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e(1);.  }.#endif
221c0 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
221d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
221e0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20  LETE_NOENT ){.  
221f0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
22200 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22210 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e  DELETE, lastErrn
22220 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
22230 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69  "winDelete", zFi
22240 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
22250 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63  {.    logIoerr(c
22260 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
22270 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22280 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ed);.  OSTRACE((
22290 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
222a0 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65   rc=%s\n", zFile
222b0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  name, sqlite3Err
222c0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
222d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
222e0 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73  * Check the exis
222f0 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73  tence and status
22300 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   of a file..*/.s
22310 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
22320 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
22330 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
22340 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
22350 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
22360 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
22370 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
22380 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
22390 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
223c0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
223d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
223e0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
223f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
22400 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ult */.){.  DWOR
22410 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
22420 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
22430 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20  stErrno;.  void 
22440 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
22450 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22460 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
22470 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
22480 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
22490 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
224a0 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
224b0 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
224c0 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
224d0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
224e0 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
224f0 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
22500 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
22510 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
22520 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
22530 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
22540 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
22550 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  SS name=%s, rc=S
22560 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22570 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
22580 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22590 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
225a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
225b0 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
225c0 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
225d0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
225e0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
225f0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
22600 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
22610 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
22620 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
22630 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
22640 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
22650 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
22680 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
22690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
226b0 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
226c0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
226d0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
226e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
226f0 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
22700 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
22710 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
22720 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
22730 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
22740 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
22750 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
22760 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
22770 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
22780 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
22790 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
227a0 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
227b0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
227c0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
227d0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
227e0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
227f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
22800 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22810 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
22820 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
22830 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
22840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22850 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
22860 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
22870 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
22880 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61  _NOT_FOUND && la
22890 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50  stErrno!=ERROR_P
228a0 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
228b0 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  .        winLogE
228c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
228d0 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72  R_ACCESS, lastEr
228e0 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22  rno, "winAccess"
228f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
22900 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22910 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22920 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
22940 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  SS;.      }else{
22950 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
22960 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
22970 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
22980 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
22990 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
229a0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
229b0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
229c0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
229d0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
229e0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
229f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22a00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
22a10 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
22a20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
22a30 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
22a40 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
22a50 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
22a60 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
22a70 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
22a80 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
22a90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
22aa0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
22ab0 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
22ac0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
22ad0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
22af0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
22b00 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
22b10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22b20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
22b30 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
22b40 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
22b50 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
22b60 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
22b70 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
22b80 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
22b90 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
22ba0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
22bb0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
22bc0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
22bd0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
22be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22bf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
22c00 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
22c10 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
22c20 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
22c30 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
22c40 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
22c50 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
22c60 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
22c70 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
22c80 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
22c90 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
22ca0 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
22cb0 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
22cc0 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
22cd0 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
22ce0 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
22cf0 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
22d00 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
22d10 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
22d20 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
22d30 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
22d40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22d50 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
22d60 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
22d70 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
22d80 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
22d90 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
22da0 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
22db0 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
22dc0 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
22dd0 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
22de0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
22df0 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
22e00 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
22e10 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
22e20 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
22e30 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
22e40 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
22e50 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
22e60 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
22e70 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
22e80 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
22e90 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
22ea0 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
22eb0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
22ec0 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
22ed0 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
22ee0 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e  */.  if ( zPathn
22ef0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a  ame[0]=='/' || z
22f00 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c  Pathname[0]=='\\
22f10 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
22f20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
22f30 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
22f40 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
22f50 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61  h a letter and a
22f60 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74   colon it is eit
22f70 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a  her a volume.  *
22f80 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  * relative path 
22f90 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
22fa0 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66  ath.  Callers of
22fb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
22fc0 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74  ust not.  ** att
22fd0 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74  empt to treat it
22fe0 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70   as a relative p
22ff0 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74  ath name (i.e. t
23000 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c  hey should simpl
23010 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65  y use.  ** it ve
23020 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20  rbatim)..  */.  
23030 69 66 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c  if ( sqlite3Isal
23040 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  pha(zPathname[0]
23050 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31  ) && zPathname[1
23060 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65  ]==':' ){.    re
23070 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
23080 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    /*.  ** If we 
23090 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
230a0 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  t, the path name
230b0 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63   should almost c
230c0 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75  ertainly be a pu
230d0 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69  rely.  ** relati
230e0 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74  ve one (i.e. not
230f0 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74   a UNC name, not
23100 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e   absolute, and n
23110 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69  ot volume relati
23120 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ve)..  */.  retu
23130 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a  rn FALSE;.}../*.
23140 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
23150 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
23160 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
23170 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
23180 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
23190 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
231a0 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
231b0 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
231c0 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
231d0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
231e0 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
231f0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
23200 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
23210 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23220 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
23230 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23240 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
23250 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
23260 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
23270 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
23280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23290 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
232a0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
232b0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
232c0 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
232d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
232e0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
232f0 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
23300 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
23310 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
23320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23330 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
23340 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
23350 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
23360 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 53 51 4c  >mxPathname>=SQL
23370 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
23380 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
23390 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
233a0 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
233b0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
233c0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
233d0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
233e0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
233f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
23400 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
23410 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
23420 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
23430 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
23440 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
23450 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
23460 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
23470 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
23480 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
23490 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
234a0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
234b0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
234c0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
234d0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
234e0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
234f0 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
23500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
23510 20 7a 4f 75 74 5b 53 51 4c 49 54 45 5f 57 49 4e   zOut[SQLITE_WIN
23520 33 32 5f 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  32_MAX_PATH+1];.
23530 20 20 20 20 6d 65 6d 73 65 74 28 7a 4f 75 74 2c      memset(zOut,
23540 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
23550 5f 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20  _MAX_PATH+1);.  
23560 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61    cygwin_conv_pa
23570 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f  th(CCP_POSIX_TO_
23580 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49  WIN_A|CCP_RELATI
23590 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  VE, zRelative, z
235a0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
235b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
235c0 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 2b  _WIN32_MAX_PATH+
235d0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
235e0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
235f0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
23600 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
23610 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s\\%s",.        
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23630 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
23640 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65  ory, zOut);.  }e
23650 6c 73 65 7b 0a 20 20 20 20 63 79 67 77 69 6e 5f  lse{.    cygwin_
23660 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f 50 4f  conv_path(CCP_PO
23670 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52  SIX_TO_WIN_A, zR
23680 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 2c 20  elative, zFull, 
23690 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  nFull);.  }.  re
236a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
236b0 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
236c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
236d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
236e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
236f0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
23700 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
23710 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
23720 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
23730 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
23740 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
23750 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
23760 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
23770 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
23780 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
23790 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
237a0 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
237b0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
237c0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
237d0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
237e0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
237f0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
23800 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
23810 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
23820 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
23830 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
23840 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
23850 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
23860 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
23870 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
23880 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
23890 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
238a0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
238b0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
238c0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
238d0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
238e0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
238f0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
23900 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
23910 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
23920 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
23930 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
23940 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c  me), zFull, "%s\
23950 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \%s",.          
23960 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23970 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
23980 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  y, zRelative);. 
23990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
239a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
239b0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
239c0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
239d0 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
239e0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
239f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
23a00 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
23a10 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
23a20 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
23a30 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
23a40 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
23a50 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
23a60 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
23a70 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
23a80 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
23a90 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
23aa0 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
23ab0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
23ac0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
23ad0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
23ae0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
23af0 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
23b00 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
23b10 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49  ='/' && sqlite3I
23b20 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65  salpha(zRelative
23b30 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76  [1]) && zRelativ
23b40 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  e[2]==':' ){.   
23b50 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
23b60 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
23b70 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
23b80 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
23b90 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
23ba0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
23bb0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
23bc0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
23bd0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
23be0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
23bf0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
23c00 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
23c10 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
23c20 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
23c30 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
23c40 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
23c50 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
23c60 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
23c70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
23c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23c90 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
23ca0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
23cb0 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
23cc0 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
23cd0 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
23ce0 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
23cf0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
23d00 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
23d10 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
23d20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
23d30 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
23d40 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
23d50 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
23d60 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
23d70 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
23d80 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
23d90 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
23da0 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
23db0 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
23dc0 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
23dd0 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
23de0 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
23df0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
23e00 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
23e10 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
23e20 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
23e30 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20  "%s\\%s",.      
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23e50 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
23e60 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65  ctory, zRelative
23e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23e80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
23e90 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
23ea0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
23eb0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
23ec0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
23ed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23ee0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23ef0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
23f00 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52  () ){.    LPWSTR
23f10 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74   zTemp;.    nByt
23f20 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
23f30 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
23f40 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
23f50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
23f60 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
23f70 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23f80 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c  TE_ERROR, osGetL
23f90 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47                "G
23fb0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 31  etFullPathNameW1
23fc0 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ", zConverted);.
23fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23fe0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
23ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24000 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
24010 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  LPATH;.    }.   
24020 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
24030 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
24040 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
24050 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
24060 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
24070 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
24080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24090 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
240a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
240b0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
240c0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
240d0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
240e0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
240f0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
24100 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
24110 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
24120 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24130 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
24140 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24160 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
24170 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  2", zConverted);
24180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24190 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
241a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
241b0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
241c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
241d0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
241e0 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  H;.    }.    sql
241f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
24200 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
24210 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
24220 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
24230 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
24240 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
24250 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
24260 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
24270 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
24280 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
24290 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
242a0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
242b0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
242c0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
242d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
242e0 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
242f0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24310 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
24320 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  1", zConverted);
24330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24340 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24360 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
24370 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
24380 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
24390 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
243a0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
243b0 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
243c0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
243d0 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
243e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
243f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
24410 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
24420 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
24430 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
24440 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
24450 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
24460 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
24470 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
24480 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
24490 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c  TE_ERROR, osGetL
244a0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47                "G
244c0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 32  etFullPathNameA2
244d0 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ", zConverted);.
244e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
244f0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24510 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ee(zTemp);.     
24520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24530 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
24540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24550 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24560 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
24570 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
24580 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
24590 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
245a0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
245b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f  .#endif.  if( zO
245c0 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
245d0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
245e0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
245f0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
24600 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
24610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
24620 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ut);.    return 
24630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
24640 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
24650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24660 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
24670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24680 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
24690 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
246a0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
246b0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
246c0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
246d0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
246e0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
246f0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
24700 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
24710 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
24720 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
24730 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
24740 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
24750 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
24760 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
24770 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
24780 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
24790 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
247a0 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c  atic void *winDl
247b0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
247c0 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
247d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
247e0 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f    HANDLE h;.  vo
247f0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
24800 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
24810 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
24820 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24830 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
24840 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
24850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
24860 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
24870 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
24880 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20  S_WINRT.    h = 
24890 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
248a0 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a  brary((LPCWSTR)z
248b0 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23  Converted, 0);.#
248c0 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c  else.    h = osL
248d0 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43  oadLibraryW((LPC
248e0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29  WSTR)zConverted)
248f0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
24900 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
24910 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
24920 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  {.    h = osLoad
24930 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
24940 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
24950 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
24960 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24970 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
24980 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
24990 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
249a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
249b0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
249c0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
249d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
249e0 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
249f0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
24a00 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
24a10 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
24a20 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
24a30 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
24a40 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63  *pVfs,void *pH,c
24a50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
24a60 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45  )(void){.  UNUSE
24a70 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
24a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
24a90 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74  d(*)(void))osGet
24aa0 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
24ab0 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a  NDLE)pH, zSym);.
24ac0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
24ad0 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
24ae0 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
24af0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
24b00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
24b10 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69  Vfs);.  osFreeLi
24b20 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
24b30 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
24b40 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
24b50 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
24b60 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
24b70 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
24b80 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
24b90 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
24ba0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
24bb0 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
24bc0 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
24bd0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
24be0 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
24bf0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
24c00 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
24c10 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
24c20 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
24c30 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
24c40 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
24c50 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
24c60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24c70 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
24c80 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
24c90 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
24ca0 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
24cb0 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
24cc0 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
24cd0 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
24ce0 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
24cf0 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
24d00 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
24d10 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
24d20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
24d30 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
24d40 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
24d50 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
24d60 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
24d70 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
24d80 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
24d90 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
24da0 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
24db0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
24dc0 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
24dd0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
24de0 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
24df0 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
24e00 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
24e10 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
24e20 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
24e30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
24e40 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
24e50 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
24e60 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
24e70 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
24e80 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
24e90 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
24ea0 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
24eb0 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
24ec0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
24ed0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
24ee0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
24ef0 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
24f00 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
24f10 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
24f20 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
24f30 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
24f40 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
24f50 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
24f60 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
24f70 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
24f80 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
24f90 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
24fa0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
24fb0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
24fc0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
24fd0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
24fe0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
24ff0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
25000 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
25010 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
25020 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
25030 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
25040 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
25050 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
25060 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25070 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
25080 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
25090 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
250a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
250b0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
250c0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
250d0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
250e0 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
250f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
25100 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
25110 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
25120 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
25130 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
25140 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
25150 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
25160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
25170 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
25180 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
25190 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
251a0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
251b0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
251c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
251d0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
251e0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
251f0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
25200 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
25210 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
25220 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
25230 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
25240 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
25250 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
25260 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
25270 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
25280 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
25290 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
252a0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
252b0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
252c0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
252d0 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
252e0 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
252f0 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
25300 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
25310 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
25320 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
25330 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
25340 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25350 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
25360 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
25370 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
25380 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
25390 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
253a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
253b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
253c0 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c  piNow){.  /* FIL
253d0 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20  ETIME structure 
253e0 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75  is a 64-bit valu
253f0 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  e representing t
25400 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  he number of .  
25410 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
25420 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
25430 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
25440 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
25450 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45  5). .  */.  FILE
25460 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69  TIME ft;.  stati
25470 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
25480 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d  int64 winFiletim
25490 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33  eEpoch = 2305813
254a0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
254b0 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66  )8640000;.#ifdef
254c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
254d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
254e0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
254f0 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
25500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
25510 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
25520 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f  /* 2^32 - to avo
25530 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64  id use of LL and
25540 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63   warnings in gcc
25550 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
25560 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
25570 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d   max32BitValue =
25580 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33   .      (sqlite3
25590 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
255a0 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
255b0 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a  64)2000000000 +.
255c0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
255d0 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
255e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
255f0 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
25600 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
25610 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
25620 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
25630 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
25640 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
25650 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
25660 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
25670 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
25680 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
25690 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
256a0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
256b0 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
256c0 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
256d0 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
256e0 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
256f0 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
25700 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
25710 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
25720 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
25730 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
25740 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
25750 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
25760 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
25770 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
25780 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
25790 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
257a0 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
257b0 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
257c0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
257d0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
257e0 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
257f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
25800 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25810 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
25820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25830 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
25840 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
25850 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
25860 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
25870 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
25880 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
25890 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
258a0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
258b0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
258c0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
258d0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
258e0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
258f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25900 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
25910 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25920 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
25930 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
25940 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
25950 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
25960 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
25970 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
25980 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
25990 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
259a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
259b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
259c0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
259d0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
259e0 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
259f0 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
25a00 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
25a10 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
25a20 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
25a30 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
25a40 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
25a50 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
25a60 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
25a70 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
25a80 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
25a90 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
25aa0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
25ab0 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
25ac0 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
25ad0 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
25ae0 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
25af0 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
25b00 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
25b10 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
25b20 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
25b30 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
25b40 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
25b50 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
25b60 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
25b70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
25b80 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
25b90 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
25ba0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
25bb0 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
25bc0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
25bd0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
25be0 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
25bf0 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
25c00 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
25c10 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
25c20 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
25c30 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
25c40 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
25c50 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
25c60 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
25c70 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
25c80 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
25c90 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
25ca0 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
25cb0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
25cc0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
25cd0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
25ce0 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
25cf0 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
25d00 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
25d10 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
25d20 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
25d30 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
25d40 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
25d50 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
25d60 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
25d70 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
25d80 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
25d90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
25da0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
25db0 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
25dc0 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
25dd0 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
25de0 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
25df0 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
25e00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
25e10 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
25e20 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
25e30 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
25e40 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
25e50 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
25e60 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
25e70 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
25e80 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
25e90 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
25ea0 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
25eb0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
25ec0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
25ed0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
25ee0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
25ef0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
25f00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25f10 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  fs);.  return ge
25f20 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
25f30 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
25f40 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
25f50 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
25f60 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
25f70 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
25f80 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
25f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25fa0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
25fb0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
25fc0 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
25fd0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
25fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
25ff0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
26000 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
26010 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
26020 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
26030 5f 4d 41 58 5f 50 41 54 48 2c 20 2f 2a 20 6d 78  _MAX_PATH, /* mx
26040 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
26050 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
26060 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
26070 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20  .    "win32",   
26080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
26090 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260b0 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
260c0 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
260d0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
260e0 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
260f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
26100 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
26110 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
26120 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
26130 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
26140 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
26150 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
26160 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
26170 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
26180 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
26190 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
261a0 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
261b0 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
261c0 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
261d0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
261e0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
261f0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
26200 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
26210 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
26220 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
26230 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
26240 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
26250 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
26260 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
26270 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
26280 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
26290 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
262a0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
262b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
262c0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
262d0 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
262e0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
262f0 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
26300 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
26310 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
26320 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
26330 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
26340 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
26350 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
26360 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62  .  };..  /* Doub
26370 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
26380 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
26390 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
263a0 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
263b0 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
263c0 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
263d0 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
263e0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
263f0 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b 0a  Syscall)==74 );.
26400 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
26410 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
26420 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
26430 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
26440 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
26450 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
26460 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
26470 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
26480 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
26490 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
264a0 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
264b0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
264c0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
264d0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
264e0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
264f0 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
26500 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
26510 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
26520 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
26530 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
26540 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26550 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c  _OK; .}..int sql
26560 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
26570 29 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ){ .#if SQLITE_O
26580 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c  S_WINRT.  if( sl
26590 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a  eepObj!=NULL ){.
265a0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
265b0 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20  e(sleepObj);.   
265c0 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
265d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
265e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
265f0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
26600 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.