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

Artifact 26d752736dff0c7e4e384ab65b353cce1e7e19c5:


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 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
0260: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0270: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0280: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0290: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
02a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
02b0: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64  ** Compiling and
02c0: 20 75 73 69 6e 67 20 57 41 4c 20 6d 6f 64 65 20   using WAL mode 
02d0: 72 65 71 75 69 72 65 73 20 73 65 76 65 72 61 6c  requires several
02e0: 20 41 50 49 73 20 74 68 61 74 20 61 72 65 20 6f   APIs that are o
02f0: 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  nly.** available
0300: 20 69 6e 20 57 69 6e 64 6f 77 73 20 70 6c 61 74   in Windows plat
0310: 66 6f 72 6d 73 20 62 61 73 65 64 20 6f 6e 20 74  forms based on t
0320: 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f  he NT kernel..*/
0330: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
0340: 57 49 4e 4e 54 20 26 26 20 21 64 65 66 69 6e 65  WINNT && !define
0350: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0360: 4c 29 0a 23 20 20 65 72 72 6f 72 20 22 57 41 4c  L).#  error "WAL
0370: 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73 20 73   mode requires s
0380: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
0390: 57 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e 65  Windows NT kerne
03a0: 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a 20 77 69 74  l, compile\. wit
03b0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  h SQLITE_OMIT_WA
03c0: 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  L.".#endif../*.*
03d0: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
03e0: 65 20 57 69 6e 33 32 20 41 4e 53 49 20 41 50 49  e Win32 ANSI API
03f0: 73 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  s available (i.e
0400: 2e 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65  . with certain e
0410: 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73  xceptions.** bas
0420: 65 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c  ed on the sub-pl
0430: 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20  atform)?.*/.#if 
0440: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
0450: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
0460: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0480: 41 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ANSI.#endif../*.
0490: 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74  ** Are most of t
04a0: 68 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65  he Win32 Unicode
04b0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
04c0: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
04d0: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
04e0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
04f0: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0500: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0510: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
0520: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0530: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
0540: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0550: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
0560: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0570: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0580: 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57  (in chars) for W
0590: 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75  in32.  This shou
05a0: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
05b0: 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23  * MAX_PATH..*/.#
05c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
05d0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
05e0: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
05f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
0600: 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f  TH_CHARS   (MAX_
0610: 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  PATH).#endif../*
0620: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0630: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0640: 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54  chars) for WinNT
0650: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0660: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33 32  ormally be.** 32
0670: 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  767..*/.#ifndef 
0680: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0690: 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64  _PATH_CHARS.#  d
06a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
06b0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
06c0: 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64  S   (32767).#end
06d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
06e0: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
06f0: 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72  h (in bytes) for
0700: 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58   Win32.  The MAX
0710: 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69  _PATH macro is i
0720: 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  n.** characters,
0730: 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20   so we allocate 
0740: 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61 72  3 bytes per char
0750: 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77  acter assuming w
0760: 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20  orst-case of.** 
0770: 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72  4-bytes-per-char
0780: 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a  acter for UTF8..
0790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
07a0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
07b0: 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65  _BYTES.#  define
07c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
07d0: 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 28  X_PATH_BYTES   (
07e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
07f0: 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23  _PATH_CHARS*4).#
0800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0810: 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65  imum pathname le
0820: 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20  ngth (in bytes) 
0830: 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73  for WinNT.  This
0840: 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
0850: 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20 73   be.** 32767 * s
0860: 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f  izeof(WCHAR)..*/
0870: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0880: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0890: 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53  YTES.#  define S
08a0: 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
08b0: 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20  PATH_BYTES   \. 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
08e0: 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49  of(WCHAR) * SQLI
08f0: 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
0900: 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a  H_CHARS).#endif.
0910: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65  ./*.** Maximum e
0920: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e  rror message len
0930: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0940: 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66  or WinRT..*/.#if
0950: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0960: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
0970: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
0980: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
0990: 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 34  RMSG_CHARS (1024
09a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
09b0: 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
09c0: 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74 65   if the characte
09d0: 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61  r should be trea
09e0: 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74 6f  ted as a directo
09f0: 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  ry.** separator.
0a00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49  .*/.#ifndef winI
0a10: 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e  sDirSep.#  defin
0a20: 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61 29  e winIsDirSep(a)
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c  (((a) == '/') ||
0a50: 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a   ((a) == '\\')).
0a60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0a70: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
0a80: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0a90: 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72 65  used as the dire
0aa0: 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 2e  ctory separator.
0ab0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 47  .*/.#ifndef winG
0ac0: 65 74 44 69 72 44 65 70 0a 23 20 20 69 66 64 65  etDirDep.#  ifde
0ad0: 66 20 5f 5f 43 59 47 57 49 4e 5f 5f 0a 23 20 20  f __CYGWIN__.#  
0ae0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
0af0: 69 72 44 65 70 28 29 20 20 20 20 20 20 20 20 20  irDep()         
0b00: 20 20 20 20 20 22 2f 22 0a 23 20 20 65 6c 73 65       "/".#  else
0b10: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 77 69 6e  .#    define win
0b20: 47 65 74 44 69 72 44 65 70 28 29 20 20 20 20 20  GetDirDep()     
0b30: 20 20 20 20 20 20 20 20 20 22 5c 5c 22 0a 23 20           "\\".# 
0b40: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0b50: 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20  *.** Do we need 
0b60: 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69  to manually defi
0b70: 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c  ne the Win32 fil
0b80: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66  e mapping APIs f
0b90: 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a  or use with WAL.
0ba0: 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68  ** mode (e.g. th
0bb0: 65 73 65 20 41 50 49 73 20 61 72 65 20 61 76 61  ese APIs are ava
0bc0: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69  ilable in the Wi
0bd0: 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f  ndows CE SDK; ho
0be0: 77 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61  wever, they.** a
0bf0: 72 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  re not present i
0c00: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c  n the header fil
0c10: 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  e)?.*/.#if SQLIT
0c20: 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50  E_WIN32_FILEMAPP
0c30: 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66 69  ING_API && !defi
0c40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0c50: 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f  WAL)./*.** Two o
0c60: 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69  f the file mappi
0c70: 6e 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66  ng APIs are diff
0c80: 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52  erent under WinR
0c90: 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  T.  Figure out w
0ca0: 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e  hich.** set we n
0cb0: 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  eed..*/.#if SQLI
0cc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42  TE_OS_WINRT.WINB
0cd0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
0ce0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
0cf0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41  appingFromApp(HA
0d00: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
0d10: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
0d20: 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c  BUTES, ULONG, UL
0d30: 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b  ONG64, LPCWSTR);
0d40: 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56  ..WINBASEAPI LPV
0d50: 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69  OID WINAPI MapVi
0d60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
0d70: 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55  HANDLE, ULONG, U
0d80: 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b  LONG64, SIZE_T);
0d90: 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e  .#else.#if defin
0da0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0db0: 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53  HAS_ANSI).WINBAS
0dc0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
0dd0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
0de0: 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50  pingA(HANDLE, LP
0df0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0e00: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
0e10: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
0e20: 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e  RD, LPCSTR);.#en
0e30: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
0e40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0e50: 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65  ANSI) */..#if de
0e60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0e70: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e  32_HAS_WIDE).WIN
0e80: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
0e90: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
0ea0: 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c  MappingW(HANDLE,
0eb0: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
0ec0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
0ed0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
0ee0: 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b  DWORD, LPCWSTR);
0ef0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
0f00: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0f10: 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49  HAS_WIDE) */..WI
0f20: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
0f30: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
0f40: 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f  File(HANDLE, DWO
0f50: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0f60: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69  , SIZE_T);.#endi
0f70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
0f80: 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  INRT */../*.** T
0f90: 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  his file mapping
0fa0: 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74   API is common t
0fb0: 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64  o both Win32 and
0fc0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41   WinRT..*/.WINBA
0fd0: 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50  SEAPI BOOL WINAP
0fe0: 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  I UnmapViewOfFil
0ff0: 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64  e(LPCVOID);.#end
1000: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
1010: 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41  32_FILEMAPPING_A
1020: 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  PI && !defined(S
1030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
1040: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
1050: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
1060: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
1070: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
1080: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
1090: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
10a0: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
10b0: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
10c0: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
10d0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
10e0: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
10f0: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
1100: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
1110: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
1120: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
1130: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
1140: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
1150: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
1160: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
1190: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
11a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
11b0: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11d0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
11e0: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
11f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1200: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
1210: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
1220: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
1230: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
1240: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
1250: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
1260: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
1270: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
1280: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
1290: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
12a0: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
12b0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
12c0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
12d0: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
12e0: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
12f0: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
1300: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
1310: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
1320: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
1330: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
1340: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1350: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
1360: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
1370: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
1380: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
1390: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
13a0: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
13b0: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
13c0: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
13d0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
13e0: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
13f0: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
1400: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
1410: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
1420: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1430: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
1440: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
1450: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
1460: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
1470: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
1480: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
1490: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
14a0: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
14b0: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
14c0: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
14d0: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
14e0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
14f0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
1500: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
1510: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
1520: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1530: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
1540: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
1550: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
1560: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
1570: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
1580: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1590: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
15a0: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
15b0: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
15c0: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
15d0: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
15e0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
15f0: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1600: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1610: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1620: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
1630: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
1640: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1650: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1660: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1690: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
16a0: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
16b0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
16c0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
16d0: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
16e0: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
16f0: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1700: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1710: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
1730: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
1740: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1750: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1760: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1770: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
1780: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1790: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
17a0: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
17b0: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
17c0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
17d0: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
17e0: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
17f0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1800: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1810: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1820: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1830: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
1840: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
1850: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
1860: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
1870: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
1880: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1890: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
18a0: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
18b0: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
18c0: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
18d0: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
18e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1900: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1930: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
1940: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
1950: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1970: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1980: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
1990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
19a0: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
19b0: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
19c0: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
19d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
19e0: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
19f0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1a00: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1a10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a20: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1a30: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
1a40: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
1a50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1a60: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
1a70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1a80: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1a90: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1aa0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1ab0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1ac0: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1ae0: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
1af0: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
1b00: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
1b10: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1b20: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
1b30: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
1b40: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
1b50: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
1b60: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
1b70: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
1b90: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ba0: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
1bb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1bc0: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
1bd0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
1be0: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
1bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1c00: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
1c10: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c20: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
1c30: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
1c40: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
1c50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
1c60: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
1c70: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
1c80: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1c90: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1ca0: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
1cb0: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
1cc0: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
1cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1ce0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1cf0: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
1d00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
1d10: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1d20: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
1d30: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
1d40: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1d50: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1d60: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
1d70: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
1d80: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1d90: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1da0: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1dc0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
1dd0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1de0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1df0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
1e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
1e10: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
1e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
1e30: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
1e40: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
1e50: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
1e60: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
1e70: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
1e80: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
1e90: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1ea0: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
1eb0: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
1ec0: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
1ed0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
1ee0: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
1ef0: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
1f00: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
1f10: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
1f20: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
1f30: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
1f40: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
1f50: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
1f60: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
1f70: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
1f80: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
1f90: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
1fa0: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
1fb0: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
1fc0: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
1fd0: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
1fe0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2030: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
2040: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
2050: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2060: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
2070: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
2080: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
2090: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
20a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
20b0: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
20c0: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
20d0: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
20e0: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
20f0: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
2100: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
2110: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
2120: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
2130: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
2140: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
2150: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
2160: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
2170: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
2180: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
2190: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
21a0: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
21b0: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
2210: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2220: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
2230: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2240: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
2250: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
2260: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
2270: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2280: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2290: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
22a0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
22b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
22d0: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
22e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
22f0: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
2300: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2310: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_SIZE) * \.   
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
2350: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
2360: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
2370: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
2380: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
2390: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
23a0: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
23b0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
23c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23d0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
23e0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
23f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2400: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
2410: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2420: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
2430: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
2440: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
2450: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
2460: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
2470: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2480: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
2490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
24a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
24b0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
24c0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
24d0: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
24e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65  ./*.** The winMe
24f0: 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  mData structure 
2500: 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69  stores informati
2510: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74  on required by t
2520: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2530: 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d  c.** sqlite3_mem
2540: 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65  _methods impleme
2550: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  ntation..*/.type
2560: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65  def struct winMe
2570: 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61  mData winMemData
2580: 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  ;.struct winMemD
2590: 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ata {.#ifndef ND
25a0: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
25b0: 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  ;    /* Magic nu
25c0: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
25d0: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
25e0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ion. */.#endif. 
25f0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f   HANDLE hHeap; /
2600: 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20  * The handle to 
2610: 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42  our heap. */.  B
2620: 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20  OOL bOwned;  /* 
2630: 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65  Do we own the he
2640: 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79  ap (i.e. destroy
2650: 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29   it on shutdown)
2660: 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ? */.};..#ifndef
2670: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2680: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20  WINMEM_MAGIC    
2690: 20 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64   0x42b2830b.#end
26a0: 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  if..static struc
26b0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
26c0: 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69  _mem_data = {.#i
26d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57  fndef NDEBUG.  W
26e0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e  INMEM_MAGIC,.#en
26f0: 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53  dif.  NULL, FALS
2700: 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  E.};..#ifndef ND
2710: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e  EBUG.#define win
2720: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
2730: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2740: 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e  _data.magic==WIN
2750: 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73  MEM_MAGIC ).#els
2760: 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  e.#define winMem
2770: 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65  AssertMagic().#e
2780: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69  ndif..#define wi
2790: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77 69  nMemGetHeap() wi
27a0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70  n_mem_data.hHeap
27b0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ..static void *w
27c0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
27d0: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
27e0: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
27f0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73  void *pPrior);.s
2800: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
2810: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
2820: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
2830: 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  es);.static int 
2840: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
2850: 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  *p);.static int 
2860: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
2870: 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t n);.static int
2880: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
2890: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61   *pAppData);.sta
28a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
28b0: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
28c0: 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20  ppData);..const 
28d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
28e0: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
28f0: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23  etWin32(void);.#
2900: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2910: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
2920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2930: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
2940: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20   (normally) set 
2950: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63  once and never c
2960: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61  hanges.** therea
2970: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64  fter.  It record
2980: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70  s whether the op
2990: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
29a0: 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69  s Win9x.** or Wi
29b0: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20  nNT..**.** 0:   
29c0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
29d0: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20   unknown..** 1: 
29e0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
29f0: 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20  em is Win9x..** 
2a00: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  2:   Operating s
2a10: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a  ystem is WinNT..
2a20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74  **.** In order t
2a30: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73  o facilitate tes
2a40: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20  ting on a WinNT 
2a50: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74  system, the test
2a60: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20   fixture.** can 
2a70: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69  manually set thi
2a80: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20  s value to 1 to 
2a90: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65  emulate Win98 be
2aa0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65  havior..*/.#ifde
2ab0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ac0: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2ad0: 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  e = 0;.#else.sta
2ae0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
2af0: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e  os_type = 0;.#en
2b00: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53  dif..#ifndef SYS
2b10: 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53  CALL.#  define S
2b20: 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73  YSCALL sqlite3_s
2b30: 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69  yscall_ptr.#endi
2b40: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2b50: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
2b60: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
2b70: 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a  ws CE or WinRT..
2b80: 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
2b90: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
2ba0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64  TE_OS_WINRT.#  d
2bb0: 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41  efine osAreFileA
2bc0: 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20  pisANSI()       
2bd0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
2be0: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
2bf0: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
2c00: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
2c10: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
2c20: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
2c30: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
2c40: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
2c50: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
2c60: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
2c70: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
2c80: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
2c90: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
2ca0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
2cb0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
2cc0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
2cd0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
2ce0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2cf0: 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20   win_syscall {. 
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2d10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2d20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2d30: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2d40: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2d50: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2d60: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
2d70: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
2d80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2d90: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
2da0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
2db0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
2dc0: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
2dd0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2de0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2df0: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
2e00: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
2e10: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
2e20: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
2e30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2e40: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
2e50: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
2e60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2e80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
2e90: 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69  def osAreFileApi
2ea0: 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73  sANSI.#define os
2eb0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20  AreFileApisANSI 
2ec0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2ed0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30  VOID))aSyscall[0
2ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
2ef0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
2f00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
2f10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2f20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2f30: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
2f40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2f50: 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20  L)CharLowerW,   
2f60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2f70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c  #else.  { "CharL
2f80: 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  owerW",         
2f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2fc0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
2fd0: 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54  arLowerW ((LPWST
2fe0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
2ff0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  R))aSyscall[1].p
3000: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3010: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3030: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3040: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
3050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3060: 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65  SYSCALL)CharUppe
3070: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3080: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3090: 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20  "CharUpperW",   
30a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
30b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
30d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
30e0: 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28  e osCharUpperW (
30f0: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3100: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
3110: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
3120: 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65    { "CloseHandle
3130: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3140: 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e  SYSCALL)CloseHan
3150: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
3160: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3170: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42  sCloseHandle ((B
3180: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3190: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  DLE))aSyscall[3]
31a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
31b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
31c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
31d0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
31e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
31f0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3200: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
3210: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3220: 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20  CreateFileA",   
3230: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3240: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3260: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3270: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28   osCreateFileA (
3280: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3290: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57  (LPCSTR,DWORD,DW
32a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
32b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
32c0: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
32d0: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
32e0: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
32f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3300: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3310: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3320: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3330: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3340: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3350: 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20  reateFileW,     
3360: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3370: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3380: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3390: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
33c0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
33d0: 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28  eFileW ((HANDLE(
33e0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
33f0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
3400: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
3410: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
3420: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3440: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53  urrent)..#if (!S
3450: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3460: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3470: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3480: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34a0: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
34b0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
34c0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
34d0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
34e0: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
34f0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3500: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
3510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3540: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20  ateFileMappingA 
3560: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3570: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
3580: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
3590: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
35a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53  DWORD,DWORD,LPCS
35b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
35c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
35d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
35e0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
35f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3610: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
3620: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
3630: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20  TE_OMIT_WAL)).  
3640: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
3650: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
3660: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
3670: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
3680: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3690: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
36a0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
36b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
36c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
36d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36e0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
36f0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
3700: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
3710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3720: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
3730: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
3740: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
3750: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
3760: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3770: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3780: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3790: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
37a0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
37b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37c0: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
37d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37e0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
37f0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
3800: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3830: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3840: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
3850: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
3860: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3870: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
3880: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
3890: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
38a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
38b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
38c0: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
38d0: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
38e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
38f0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
3900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3910: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
3920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3960: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
3970: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
3980: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
3990: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
39a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
39b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
39c0: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
39d0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
39f0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3a10: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
3a20: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3a30: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3a60: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
3a70: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
3a80: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
3a90: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
3aa0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3ab0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
3ac0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3ad0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3ae0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
3af0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
3b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
3b10: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3b20: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
3b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3b50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
3b60: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3b70: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
3b80: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
3b90: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
3ba0: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
3bb0: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
3bc0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3bd0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
3be0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
3bf0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
3c00: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
3c10: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
3c20: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
3c30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
3c40: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
3c80: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3c90: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
3ca0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
3cb0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
3cc0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
3cd0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3ce0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
3cf0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
3d00: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
3d10: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
3d20: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3d30: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
3d40: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
3d50: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
3d60: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3d70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3d80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3d90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
3da0: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
3db0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3dc0: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
3dd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3de0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
3df0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
3e00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
3e40: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
3e50: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3e60: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
3e70: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3e80: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
3e90: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
3ea0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3eb0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3ec0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3ed0: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
3ee0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
3ef0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
3f00: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
3f10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3f20: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
3f30: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
3f40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3f70: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
3f80: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
3f90: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
3fa0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
3fb0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
3fc0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
3fd0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
3fe0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3ff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4000: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4010: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4020: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4030: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4040: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4060: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4080: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
40b0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
40c0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
40d0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
40e0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
40f0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4100: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4110: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4120: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4130: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4140: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4150: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4160: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4170: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4180: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4190: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
41a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
41b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
41c0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
41d0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
41e0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
41f0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4200: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4210: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4220: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4230: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4250: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4260: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4270: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4280: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4290: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
42a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
42b0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
42c0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
42d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
42e0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
42f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4310: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4320: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4330: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
4340: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
4350: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
4360: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4370: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
4380: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4390: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
43a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43b0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43c0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
43d0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
43e0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
43f0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4400: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4410: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4420: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
4430: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4440: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4450: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4460: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
4470: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4480: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
4490: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
44a0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
44b0: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
44c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
44e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
44f0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
4500: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
4510: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
4520: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
4530: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4550: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4560: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4570: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4580: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
4590: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
45a0: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
45b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
45c0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
45d0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
45e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4600: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4610: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
4620: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
4630: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
4640: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
4650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4660: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4670: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4680: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4690: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
46a0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
46b0: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
46c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
46d0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
46e0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
46f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4700: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4710: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4720: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4730: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
4740: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
4750: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
4760: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
4770: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
4780: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
4790: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
47a0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
47b0: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
47c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
47d0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
47e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
47f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
4800: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4810: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4840: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
4850: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
4860: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
4870: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
4880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4890: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
48a0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
48b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
48c0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
48d0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
48e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
48f0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
4900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4910: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4920: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
4930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4960: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
4970: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
4980: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4990: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
49a0: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
49b0: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
49c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
49d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
49e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
49f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4a00: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4a10: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
4a20: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
4a30: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
4a40: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
4a50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4a60: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4a70: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
4a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4ab0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
4ac0: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
4ad0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4ae0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
4af0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
4b00: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
4b10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4b20: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
4b30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4b40: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
4b50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
4b70: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
4b80: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4b90: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
4ba0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
4bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4bc0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
4bd0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4be0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
4bf0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
4c00: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
4c10: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
4c20: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
4c30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4c40: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4c50: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4c60: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
4c80: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
4c90: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
4ca0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
4cb0: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
4cc0: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
4cd0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
4ce0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
4cf0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4d00: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
4d10: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
4d20: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
4d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4d40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
4d50: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
4d60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4d90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4da0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
4db0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
4dc0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
4dd0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
4de0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4df0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4e00: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
4e10: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
4e20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4e30: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
4e40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e50: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
4e60: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
4e70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4ea0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
4eb0: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
4ec0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
4ed0: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
4ee0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
4ef0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
4f00: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
4f10: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
4f20: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
4f30: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f40: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
4f50: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
4f60: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
4f70: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
4f80: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4f90: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4fa0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
4fb0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
4fc0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
4fd0: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
4fe0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
4ff0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5000: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5030: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5040: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5050: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5060: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5070: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5080: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5090: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
50a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
50b0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
50c0: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
50d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
50e0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
50f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5100: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5110: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5120: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5150: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5160: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5170: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5180: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5190: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
51a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
51b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
51c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
51d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
51e0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
51f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5200: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5210: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5220: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5230: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5240: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5270: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5280: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5290: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
52a0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
52b0: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
52c0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
52d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
52e0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
52f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5300: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5320: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5330: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
5340: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5370: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
5380: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
5390: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
53a0: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
53b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
53c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
53d0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56  _ANSI).  { "GetV
53e0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
53f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5400: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5410: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5420: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5430: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5440: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5470: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
5480: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
5490: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
54a0: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
54b0: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
54c0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
54d0: 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20  { "HeapAlloc",  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
54f0: 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c  SCALL)HeapAlloc,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5510: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
5520: 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  eapAlloc ((LPVOI
5530: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
5540: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
5550: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
5560: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5570: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5580: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
5590: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
55a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
55b0: 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20  HeapCreate,     
55c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
55d0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65  lse.  { "HeapCre
55e0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
55f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5620: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5630: 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28  Create ((HANDLE(
5640: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53  WINAPI*)(DWORD,S
5650: 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20  IZE_T, \.       
5660: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5670: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
5680: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5690: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44  WINRT.  { "HeapD
56a0: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
56b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
56c0: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
56d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
56e0: 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  e.  { "HeapDestr
56f0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
5700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5730: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65  #define osHeapDe
5740: 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e  stroy ((BOOL(WIN
5750: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5760: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
5770: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46  ent)..  { "HeapF
5780: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
5790: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
57a0: 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  apFree,         
57b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
57c0: 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20  fine osHeapFree 
57d0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
57e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
57f0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38  OID))aSyscall[38
5800: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5810: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20   "HeapReAlloc", 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5830: 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63  CALL)HeapReAlloc
5840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5850: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5860: 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  apReAlloc ((LPVO
5870: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
5880: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  LE,DWORD,LPVOID,
5890: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
58a0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  T))aSyscall[39].
58b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
58c0: 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20  HeapSize",      
58d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
58e0: 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20  LL)HeapSize,    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5910: 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49  Size ((SIZE_T(WI
5920: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5930: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
5940: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
5950: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
5960: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5970: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61  INRT.  { "HeapVa
5980: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
5990: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
59a0: 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20  pValidate,      
59b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
59c0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
59d0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
59e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5a10: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c  define osHeapVal
5a20: 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e  idate ((BOOL(WIN
5a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5a40: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5a50: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
5a60: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
5a70: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5a80: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
5ac0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
5ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ae0: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
5af0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
5b10: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
5b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5b60: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
5b70: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
5b80: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
5b90: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5bb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5bc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5bd0: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
5be0: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
5bf0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5c00: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
5c10: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
5c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5c30: 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20  oadLibraryW,    
5c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5c50: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
5c60: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
5c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
5cb0: 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c  ibraryW ((HMODUL
5cc0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
5cd0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d  TR))aSyscall[43]
5ce0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5cf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5d00: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
5d10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d20: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72  (SYSCALL)LocalFr
5d30: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
5d40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5d50: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5d70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5d90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5da0: 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28  ne osLocalFree (
5db0: 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29  (HLOCAL(WINAPI*)
5dc0: 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c  (HLOCAL))aSyscal
5dd0: 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[44].pCurrent).
5de0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5df0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
5e00: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5e10: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
5e20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e30: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
5e40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
5e60: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5e70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5ea0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
5eb0: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
5ec0: 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  sLockFile ((BOOL
5ed0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5ee0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5ef0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
5f00: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  ORD))aSyscall[45
5f10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
5f20: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
5f30: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
5f40: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
5f50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5f60: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
5f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f80: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
5f90: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
5fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5fd0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
5fe0: 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20  kFileEx.#define 
5ff0: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  osLockFileEx ((B
6000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6010: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6020: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6030: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6040: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36  PED))aSyscall[46
6050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6060: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
6070: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
6080: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6090: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
60a0: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
60b0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
60c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60d0: 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  LL)MapViewOfFile
60e0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
60f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56  .#else.  { "MapV
6100: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6110: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6130: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6140: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d  dif..#define osM
6150: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
6160: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6170: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6180: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6190: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
61a0: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
61b0: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
61c0: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
61d0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
61e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
61f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6200: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
6210: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
6220: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
6230: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
6240: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
6250: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  nt))aSyscall[48]
6260: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6270: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
6280: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
6290: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
62a0: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
62b0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
62c0: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
62d0: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
62e0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
62f0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
6300: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
6310: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
6320: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
6330: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6340: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
6350: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6360: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
6370: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6380: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
6390: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
63a0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
63b0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
63c0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  50].pCurrent).. 
63d0: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
63e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
63f0: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
6400: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6410: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6420: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
6430: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6440: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  DLE))aSyscall[51
6450: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6460: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6470: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
6480: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6490: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
64a0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
64c0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
64d0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
64e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6500: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6510: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6520: 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e  nter ((DWORD(WIN
6530: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e  API*)(HANDLE,LON
6540: 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20  G,PLONG, \.     
6550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6560: 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[52].pCurrent)
6570: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6580: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65  _WINRT.  { "Slee
6590: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
65a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
65b0: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
65c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
65d0: 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  se.  { "Sleep", 
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6620: 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70  .#define osSleep
6630: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6640: 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  (DWORD))aSyscall
6650: 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [53].pCurrent)..
6660: 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54    { "SystemTimeT
6670: 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28  oFileTime",    (
6680: 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69  SYSCALL)SystemTi
6690: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20  meToFileTime,   
66a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
66b0: 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
66c0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
66d0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54  API*)(CONST SYST
66e0: 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  EMTIME*, \.     
66f0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
6700: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
6710: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6720: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
6730: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6740: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
6750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6760: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
6770: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6780: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6790: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
67a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
67d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
67e0: 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23  f osUnlockFile.#
67f0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
6800: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6810: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6820: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6830: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6840: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
6850: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6860: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6870: 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  CE.  { "UnlockFi
6880: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6890: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
68a0: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
68b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
68c0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
68d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
68e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6910: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
6920: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
6930: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6940: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6950: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6960: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
6970: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6980: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
6990: 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  E || !defined(SQ
69a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
69b0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
69c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
69d0: 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77  YSCALL)UnmapView
69e0: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
69f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a00: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
6a10: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
6a20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6a50: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
6a60: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6a70: 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73  *)(LPCVOID))aSys
6a80: 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e  call[57].pCurren
6a90: 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61  t)..  { "WideCha
6aa0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20  rToMultiByte",  
6ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65     (SYSCALL)Wide
6ac0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c  CharToMultiByte,
6ad0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6ae0: 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d  ne osWideCharToM
6af0: 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57  ultiByte ((int(W
6b00: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6b10: 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c  RD,LPCWSTR,int,L
6b20: 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20  PSTR,int, \.    
6b30: 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f      LPCSTR,LPBOO
6b40: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e  L))aSyscall[58].
6b50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6b60: 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20  WriteFile",     
6b70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b80: 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20  LL)WriteFile,   
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6ba0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ..#define osWrit
6bb0: 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eFile ((BOOL(WIN
6bc0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43  API*)(HANDLE,LPC
6bd0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
6be0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6bf0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
6c00: 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e  call[59].pCurren
6c10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6c20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
6c30: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
6c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6c50: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
6c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6c70: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
6c80: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
6c90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6cc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6cd0: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
6ce0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
6cf0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
6d00: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
6d10: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
6d20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  D))aSyscall[60].
6d30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6d40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6d50: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
6d60: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
6d70: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
6d80: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
6d90: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6da0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
6db0: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
6dc0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6de0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6df0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
6e00: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
6e10: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6e20: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
6e30: 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70  ))aSyscall[61].p
6e40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e60: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
6e70: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
6e80: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
6e90: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
6ea0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
6eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6ec0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
6ed0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ef0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6f00: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
6f10: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
6f20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6f30: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6f40: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
6f50: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
6f60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6f70: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
6f80: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
6f90: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
6fa0: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
6fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6fc0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
6fd0: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
6fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7010: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7020: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
7030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7040: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
7050: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
7060: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
7070: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
7080: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7090: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
70a0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
70b0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
70c0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
70d0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
70e0: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
70f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7100: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7110: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7140: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
7150: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7160: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7170: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
7180: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
7190: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
71a0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
71b0: 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72  Syscall[64].pCur
71c0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
71d0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
71e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
71f0: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70  IT_WAL).  { "Map
7200: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7210: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
7220: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
7230: 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65  mApp,    0 },.#e
7240: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
7250: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7260: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7290: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
72a0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
72b0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
72c0: 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c  *)(HANDLE,ULONG,
72d0: 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20  ULONG64, \.     
72e0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
72f0: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7300: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7310: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
7320: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7330: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
7340: 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20  reateFile2,     
7350: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7360: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
7370: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
7380: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
73b0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
73c0: 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28  eFile2 ((HANDLE(
73d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
73e0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
73f0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
7400: 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
7410: 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
7420: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
7430: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7440: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
7450: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7460: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
7470: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61  ION).  { "LoadPa
7480: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7490: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
74a0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
74b0: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
74c0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
74d0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
74e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7510: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
7520: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
7530: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
7540: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
7550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7560: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
7570: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7580: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
7590: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
75a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
75b0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
75c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
75d0: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
75e0: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
75f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7620: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
7630: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
7640: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
7650: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d  ID))aSyscall[68]
7660: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7680: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
7690: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
76a0: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
76b0: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
76c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
76d0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
76e0: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
76f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7720: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
7730: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
7740: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
7750: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
7760: 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70  ))aSyscall[69].p
7770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
7780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7790: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
77a0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
77b0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
77c0: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
77d0: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
77e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
77f0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7800: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7840: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7850: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
7860: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
7870: 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e  call[70].pCurren
7880: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
7890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
78a0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
78b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
78c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
78d0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
78e0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
78f0: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7900: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
7910: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7940: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
7950: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
7960: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
7970: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
7980: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  71].pCurrent).. 
7990: 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65   { "GetProcessHe
79a0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  ap",          (S
79b0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73  YSCALL)GetProces
79c0: 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20  sHeap,          
79d0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
79e0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
79f0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7a00: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
7a10: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
7a20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7a30: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
7a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
7a50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
7a60: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
7a70: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7a80: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
7a90: 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  p, 0 },.#else.  
7aa0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
7ab0: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
7ac0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7ae0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7af0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7b00: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28  MappingFromApp (
7b10: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7b20: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
7b30: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
7b40: 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55  TRIBUTES,ULONG,U
7b50: 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29  LONG64,LPCWSTR))
7b60: 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75  aSyscall[73].pCu
7b70: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
7b80: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
7b90: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
7ba0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
7bb0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
7bc0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
7bd0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
7be0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
7bf0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
7c00: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7c10: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
7c20: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
7c30: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
7c40: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
7c50: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
7c60: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
7c70: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
7c80: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
7c90: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
7ca0: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
7cb0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
7cc0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
7cd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
7ce0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
7cf0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7d00: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
7d10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7d20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
7d30: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
7d40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
7d50: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
7d60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
7d70: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
7d80: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
7d90: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
7da0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
7db0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
7dc0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7dd0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
7de0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
7df0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
7e00: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
7e10: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
7e20: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
7e30: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
7e40: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
7e50: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
7e60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
7e70: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7e80: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7e90: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
7eb0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
7ed0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7ee0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
7ef0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
7f00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7f10: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
7f20: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
7f30: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
7f40: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
7f50: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
7f60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
7f70: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7f80: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7f90: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7fb0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7fe0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7ff0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
8000: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8010: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
8020: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8030: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
8040: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8060: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8070: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8080: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8090: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
80a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
80b0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
80c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
80d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
80e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
80f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
8100: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
8110: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
8120: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
8130: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
8140: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
8150: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
8160: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
8170: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
8180: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8190: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
81a0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
81b0: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
81c0: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
81d0: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
81e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
81f0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
8200: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
8210: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8220: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
8230: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
8240: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
8250: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
8260: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
8270: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8280: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8290: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
82a0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
82b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
82c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
82e0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
82f0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
8300: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
8310: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
8320: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
8330: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
8340: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8350: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
8360: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
8370: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
8380: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
8390: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
83a0: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
83b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
83c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
83d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
83e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
83f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
8400: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
8410: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
8420: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
8430: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
8440: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
8450: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8460: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
8470: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
8480: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
8490: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
84a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
84b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
84c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
84d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
84e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
84f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
8500: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8510: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8520: 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63  outputs the spec
8530: 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72  ified (ANSI) str
8540: 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ing to the Win32
8550: 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66   debugger.** (if
8560: 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
8570: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69  .void sqlite3_wi
8580: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
8590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66  const char *zBuf
85a0: 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63  , int nBuf){.  c
85b0: 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49  har zDbgBuf[SQLI
85c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
85d0: 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d  _SIZE];.  int nM
85e0: 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28  in = MIN(nBuf, (
85f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8600: 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b  _BUF_SIZE - 1));
8610: 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74   /* may be negat
8620: 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d  ive. */.  if( nM
8630: 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d  in<-1 ) nMin = -
8640: 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69  1; /* all negati
8650: 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65  ve values become
8660: 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74   -1. */.  assert
8670: 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d  ( nMin==-1 || nM
8680: 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51  in==0 || nMin<SQ
8690: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
86a0: 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64  UF_SIZE );.#if d
86b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
86c0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
86d0: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
86e0: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
86f0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8700: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8710: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
8720: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
8730: 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65  ;.    osOutputDe
8740: 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42  bugStringA(zDbgB
8750: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
8760: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
8770: 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20  tringA(zBuf);.  
8780: 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  }.#elif defined(
8790: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
87a0: 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28  _WIDE).  memset(
87b0: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
87c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
87d0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f  _SIZE);.  if ( o
87e0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
87f0: 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20  Char(.          
8800: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
8810: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
8820: 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66  P_OEMCP, 0, zBuf
8830: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e  ,.          nMin
8840: 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75  , (LPWSTR)zDbgBu
8850: 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  f, SQLITE_WIN32_
8860: 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a  DBG_BUF_SIZE/siz
8870: 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29  eof(WCHAR))<=0 )
8880: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8890: 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75  }.  osOutputDebu
88a0: 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54  gStringW((LPCWST
88b0: 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73  R)zDbgBuf);.#els
88c0: 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29  e.  if( nMin>0 )
88d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62  {.    memset(zDb
88e0: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
88f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8900: 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ZE);.    memcpy(
8910: 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e  zDbgBuf, zBuf, n
8920: 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Min);.    fprint
8930: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
8940: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
8950: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
8960: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75  tderr, "%s", zBu
8970: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
8980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8990: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75  owing routine su
89a0: 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65  spends the curre
89b0: 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74  nt thread for at
89c0: 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c   least ms.** mil
89d0: 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73  liseconds.  This
89e0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
89f0: 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65  o the Win32 Slee
8a00: 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  p() interface..*
8a10: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
8a20: 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e  WINRT.static HAN
8a30: 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e  DLE sleepObj = N
8a40: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69  ULL;.#endif..voi
8a50: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
8a60: 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c  sleep(DWORD mill
8a70: 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53  iseconds){.#if S
8a80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8a90: 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d   if ( sleepObj==
8aa0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65  NULL ){.    slee
8ab0: 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45  pObj = osCreateE
8ac0: 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55  ventExW(NULL, NU
8ad0: 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54  LL, CREATE_EVENT
8ae0: 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20  _MANUAL_RESET,. 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8b10: 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d  YNCHRONIZE);.  }
8b20: 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70  .  assert( sleep
8b30: 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f  Obj!=NULL );.  o
8b40: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
8b50: 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c  jectEx(sleepObj,
8b60: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46   milliseconds, F
8b70: 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  ALSE);.#else.  o
8b80: 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f  sSleep(milliseco
8b90: 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  nds);.#endif.}..
8ba0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
8bb0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
8bc0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
8bd0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
8be0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
8bf0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
8c00: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
8c10: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
8c20: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
8c30: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
8c40: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
8c50: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
8c60: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
8c70: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
8c80: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
8c90: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
8ca0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
8cb0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
8cc0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
8cd0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
8ce0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
8cf0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
8d00: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8d10: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8d20: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
8d30: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
8d40: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
8d50: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
8d60: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
8d70: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
8d80: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
8d90: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
8da0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8db0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
8dc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65  TE_OS_WINRT.# de
8dd0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
8de0: 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  1).#elif !define
8df0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8e00: 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e  AS_WIDE).# defin
8e10: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a  e osIsNT()  (0).
8e20: 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69  #else.  static i
8e30: 6e 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b  nt osIsNT(void){
8e40: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8e50: 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  _os_type==0 ){. 
8e60: 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e       OSVERSIONIN
8e70: 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20  FOA sInfo;.     
8e80: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
8e90: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
8ea0: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
8eb0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
8ec0: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  A(&sInfo);.     
8ed0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
8ee0: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
8ef0: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
8f00: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
8f10: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
8f20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
8f30: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
8f40: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
8f50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8f60: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
8f70: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
8f80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
8f90: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
8fa0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
8fb0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
8fc0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
8fd0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
8fe0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
8ff0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
9000: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
9010: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9020: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9030: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9040: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9050: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9060: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
9070: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
9080: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
9090: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
90a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
90b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
90c0: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
90d0: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
90e0: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
90f0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9100: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
9110: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
9120: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
9130: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9140: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
9150: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
9160: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
9170: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9180: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
9190: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
91a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
91b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
91c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
91d0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
91e0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
91f0: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
9200: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
9210: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
9220: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
9230: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
9240: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
9260: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
9270: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
9280: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9290: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
92a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
92b0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
92c0: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
92d0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
92e0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
92f0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
9300: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
9310: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20  Prior ) return; 
9320: 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20  /* Passing NULL 
9330: 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75  to HeapFree is u
9340: 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69  ndefined. */.  i
9350: 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68  f( !osHeapFree(h
9360: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9370: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
9380: 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71  Prior) ){.    sq
9390: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
93a0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
93b0: 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63  to HeapFree bloc
93c0: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
93d0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
93e0: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
93f0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9400: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9410: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
9420: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
9430: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
9440: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
9450: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
9460: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
9470: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
9480: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
9490: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
94a0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
94b0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
94c0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
94d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
94e0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
94f0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9500: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9510: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9520: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9530: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9540: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9550: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
9560: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
9570: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9580: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
9590: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
95a0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
95b0: 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  );.  if( !pPrior
95c0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65   ){.    p = osHe
95d0: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
95e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
95f0: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
9600: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65  nBytes);.  }else
9610: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
9620: 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  ReAlloc(hHeap, S
9630: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9640: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20  _FLAGS, pPrior, 
9650: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
9660: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b  .  }.  if( !p ){
9670: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
9680: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
9690: 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20  failed to %s %u 
96a0: 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70  bytes (%d), heap
96b0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
96c0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
96d0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
96e0: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
96f0: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
9700: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
9710: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
9720: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
9730: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
9740: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
9750: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
9760: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
9770: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
9780: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
9790: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
97a0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
97b0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
97c0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
97d0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
97e0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
97f0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
9800: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
9810: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9820: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9830: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9850: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
9860: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
9870: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
9880: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9890: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
98a0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
98b0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
98c0: 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70   0;.  n = osHeap
98d0: 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Size(hHeap, SQLI
98e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
98f0: 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e  AGS, p);.  if( n
9900: 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a  ==(SIZE_T)-1 ){.
9910: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9920: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
9930: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a  ailed to HeapSiz
9940: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
9950: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9960: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
9970: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9980: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9990: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
99a0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
99b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
99c0: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
99d0: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
99e0: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
99f0: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
9a00: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
9a10: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
9a20: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
9a30: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
9a40: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
9a50: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
9a60: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
9a70: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
9a80: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
9a90: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
9aa0: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
9ab0: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
9ac0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9ad0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
9ae0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49  mData->magic==WI
9af0: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23  NMEM_MAGIC );..#
9b00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9b10: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
9b20: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a  N32_HEAP_CREATE.
9b30: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9b40: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
9b50: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
9b60: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
9b70: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
9b80: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
9bc0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
9c00: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
9c10: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
9c20: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
9c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9c40: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9c50: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
9c60: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
9c70: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
9c80: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
9c90: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
9ca0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
9cb0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
9cc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
9cd0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9ce0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
9cf0: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
9d00: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
9d10: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
9d20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9d30: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
9d40: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
9d50: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
9d60: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9d70: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
9d80: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
9d90: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
9da0: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
9db0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
9dc0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
9dd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9de0: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
9df0: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
9e00: 6f 63 65 73 73 48 65 61 70 20 28 25 64 29 22 2c  ocessHeap (%d)",
9e10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9e20: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
9e30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9e40: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
9e50: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
9e60: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
9e70: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
9e80: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
9e90: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9ea0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9eb0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
9ec0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
9ed0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9ee0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9ef0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9f00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9f10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9f20: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
9f30: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
9f40: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
9f50: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9f60: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
9f70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
9f80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9f90: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
9fa0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
9fb0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
9fc0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
9fd0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
9fe0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
9ff0: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
a000: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
a010: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
a020: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
a030: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
a040: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
a050: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
a060: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
a070: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
a080: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
a090: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
a0a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
a0b0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
a0d0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
a0e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
a0f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
a100: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
a110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
a120: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a130: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
a140: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
a150: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
a160: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
a170: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a180: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a190: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
a1a0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
a1d0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69  or(), (void*)pWi
a1e0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
a1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a200: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a210: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ned = FALSE;.   
a220: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
a230: 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c  ta->hHeap = NULL
a240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
a250: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
a260: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
a270: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
a280: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
a290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
a2a0: 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74  fig.m with point
a2b0: 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69  ers to the routi
a2c0: 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
a2d0: 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  . The.** argumen
a2e0: 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62  ts specify the b
a2f0: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
a300: 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o manage..**.** 
a310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a320: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
a330: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c  qlite3_config(),
a340: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a   and therefore.*
a350: 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
a360: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
a370: 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a  fe (it is not)..
a380: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
a390: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
a3a0: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
a3b0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
a3c0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
a3d0: 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65  em_methods winMe
a3e0: 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  mMethods = {.   
a3f0: 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20   winMemMalloc,. 
a400: 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20     winMemFree,. 
a410: 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63     winMemRealloc
a420: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65  ,.    winMemSize
a430: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e  ,.    winMemRoun
a440: 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49  dup,.    winMemI
a450: 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  nit,.    winMemS
a460: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69  hutdown,.    &wi
a470: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a  n_mem_data.  };.
a480: 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d    return &winMem
a490: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64  Methods;.}..void
a4a0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
a4b0: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
a4c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
a4d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
a4e0: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
a4f0: 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e  tWin32());.}.#en
a500: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
a510: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
a520: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
a530: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d  TF-8 string to M
a540: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
a550: 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a   (UTF-16?). .**.
a560: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a570: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a580: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a590: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
a5a0: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77  .static LPWSTR w
a5b0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
a5c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
a5d0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
a5e0: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
a5f0: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
a600: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
a610: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
a620: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
a630: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
a640: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
a650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a660: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
a670: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
a680: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
a690: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
a6a0: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
a6b0: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
a6c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a6d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
a6e0: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
a6f0: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
a700: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
a710: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
a720: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
a750: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
a760: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a770: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
a780: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
a790: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a7a0: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
a7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
a7c0: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
a7d0: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
a7e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
a7f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
a800: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
a810: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
a820: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
a830: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
a840: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
a850: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
a860: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
a870: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
a880: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
a890: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
a8a0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
a8b0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
a8c0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
a8d0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a8e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a8f0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
a900: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
a910: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
a920: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
a930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a940: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a950: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
a960: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
a970: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a980: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
a990: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
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 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
a9c0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a9d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a9e0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
a9f0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
aa00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
aa10: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
aa20: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
aa30: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
aa40: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
aa50: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
aa60: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
aa70: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
aa80: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
aa90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
aaa0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
aab0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
aac0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
aad0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
aae0: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
aaf0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
ab00: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
ab10: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
ab20: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
ab30: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
ab40: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
ab50: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
ab60: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
ab70: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
ab80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
ab90: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
aba0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
abb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
abe0: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
abf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ac00: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
ac10: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
ac20: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
ac30: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
ac40: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
ac50: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
ac60: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
ac70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
ac80: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
ac90: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
aca0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
acb0: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
acc0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
acf0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
ad00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ad10: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
ad20: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
ad30: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
ad40: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
ad50: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
ad60: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
ad70: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
ad80: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
ad90: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
ada0: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
adb0: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
adc0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
add0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
ade0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
adf0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
ae00: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
ae10: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e  atic char *winUn
ae20: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
ae30: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
ae40: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
ae50: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
ae60: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
ae70: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
ae80: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
ae90: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
aea0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
aeb0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
aec0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
aed0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
aee0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
aef0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
af00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
af10: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
af20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
af30: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
af40: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
af50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
af60: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
af70: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
af80: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
af90: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
afa0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  -1, zFilename,. 
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
afd0: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
afe0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
aff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b000: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
b010: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
b020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
b030: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
b040: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
b050: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
b060: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
b070: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
b080: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
b090: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
b0a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
b0b0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
b0c0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
b0d0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
b0e0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
b0f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
b100: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57  enameUtf8;.  LPW
b110: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
b120: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d   zTmpWide = winM
b130: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  bcsToUnicode(zFi
b140: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
b150: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
b160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b170: 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20    zFilenameUtf8 
b180: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
b190: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
b1a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
b1b0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
b1c0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
b1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
b1e0: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
b1f0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
b200: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
b210: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
b220: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
b230: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
b240: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
b250: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
b260: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
b270: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
b280: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
b290: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
b2a0: 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  s;.  LPWSTR zTmp
b2b0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
b2c0: 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  e = winUtf8ToUni
b2d0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
b2e0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
b2f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b300: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
b310: 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69  ameMbcs = winUni
b320: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
b330: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
b340: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
b350: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
b360: 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meMbcs;.}../*.**
b370: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
b380: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
b390: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
b3a0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
b3b0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
b3c0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
b3d0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
b3e0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
b3f0: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
b400: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
b410: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
b420: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
b430: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
b440: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
b450: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
b460: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b470: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
b480: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
b490: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
b4a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
b4b0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
b4c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
b4d0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
b4e0: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
b4f0: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
b500: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
b510: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
b520: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
b530: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
b540: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
b550: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
b560: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
b570: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
b580: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
b590: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
b5a0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
b5b0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
b5c0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
b5d0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
b5e0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
b5f0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
b600: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
b610: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
b620: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
b630: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
b640: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
b650: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
b660: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
b670: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
b680: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
b690: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
b6a0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
b6b0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
b6c0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
b6d0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
b6e0: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
b6f0: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
b700: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
b710: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
b720: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
b730: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
b740: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
b750: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
b760: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
b770: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
b780: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
b790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b7a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b7b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
b7c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44  qlite3_free(*ppD
b7d0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a  irectory);.    *
b7e0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56  ppDirectory = zV
b7f0: 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65  alueUtf8;.    re
b800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b820: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
b830: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
b840: 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61  alue of winGetLa
b850: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
b860: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
b870: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
b880: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
b890: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
b8a0: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
b8b0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
b8c0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
b8d0: 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
b8e0: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
b8f0: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
b900: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
b910: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
b920: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
b930: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
b940: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
b950: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
b960: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
b970: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
b980: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
b990: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
b9a0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
b9b0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
b9c0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
b9d0: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
b9e0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
b9f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ba00: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
ba10: 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49  mpWide[SQLITE_WI
ba20: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
ba30: 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c  HARS+1];.    dwL
ba40: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
ba50: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
ba60: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
ba70: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
baa0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
bad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
baf0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
bb40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
bb60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
bb70: 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20  ERRMSG_CHARS,.  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
bba0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
bbb0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
bbc0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
bbd0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
bbe0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
bbf0: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
bc20: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
bc30: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
bc60: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
bc70: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
bce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
bd00: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
bd10: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
bd60: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
bd70: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
bd80: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
bd90: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
bda0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
bdb0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bdc0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
bdd0: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
bde0: 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  8(zTempWide);.  
bdf0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
be00: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69  nignMalloc();.#i
be10: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
be20: 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  RT.      /* free
be30: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
be40: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
be50: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
be60: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
be70: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23  ee(zTempWide);.#
be80: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
be90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
bea0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
beb0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
bec0: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
bed0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
bee0: 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54  tMessageA(FORMAT
bef0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
bf00: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
bf30: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
bf40: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
bf70: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
bfa0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
c010: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
c060: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
c070: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
c080: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
c090: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
c0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
c0b0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
c0c0: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
c0d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
c0e0: 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
c0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c100: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
c110: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  );.      /* free
c120: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
c130: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
c140: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
c150: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
c160: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ee(zTemp);.    }
c170: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
c180: 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a  ( 0 == dwLen ){.
c190: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c1a0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
c1b0: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20   "OsError 0x%lx 
c1c0: 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e  (%lu)", lastErrn
c1d0: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
c1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
c1f0: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
c200: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
c210: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
c220: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c230: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
c240: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
c250: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
c260: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
c270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
c280: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
c290: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
c2a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
c2b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
c2c0: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
c2d0: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
c2e0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
c2f0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
c300: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c310: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
c320: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
c330: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
c340: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
c350: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
c360: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
c370: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
c380: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
c390: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
c3a0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
c3b0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
c3c0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
c3d0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
c3e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
c3f0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
c400: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
c410: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
c420: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
c430: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
c440: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
c450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
c460: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
c470: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
c480: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
c490: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
c4a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
c4b0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
c4c0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
c4d0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
c4e0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
c4f0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
c500: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
c510: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
c520: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
c530: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
c540: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
c550: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
c560: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
c590: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
c5a0: 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
c5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
c5c0: 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
c5d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c5e0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c5f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c600: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c610: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c620: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c640: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c650: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c660: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c690: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c6a0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c6b0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
c6c0: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
c6d0: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
c6e0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
c6f0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c720: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
c730: 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
c740: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
c750: 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
c760: 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
c770: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
c780: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
c790: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
c7a0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
c7b0: 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
c7c0: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
c7d0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
c7e0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
c7f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
c800: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
c810: 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
c820: 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
c830: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
c840: 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
c850: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
c860: 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
c870: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
c880: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
c890: 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
c8a0: 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
c8b0: 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
c8c0: 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
c8d0: 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
c8e0: 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
c8f0: 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
c900: 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61   caused by .** a
c910: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
c920: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
c930: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
c940: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
c950: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
c960: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
c970: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
c980: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
c990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c9a0: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
c9b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c9c0: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
c9d0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
c9e0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c9f0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
ca00: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
ca10: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
ca20: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
ca30: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
ca40: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
ca50: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
ca60: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
ca70: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
ca80: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
ca90: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
caa0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  ;../*.** If a Re
cab0: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
cac0: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
cad0: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
cae0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
caf0: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
cb00: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
cb10: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
cb20: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
cb30: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
cb40: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
cb50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
cb60: 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  RetryIoerr(int *
cb70: 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a  pnRetry, DWORD *
cb80: 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44  pError){.  DWORD
cb90: 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
cba0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e  ror();.  if( *pn
cbb0: 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52  Retry>=winIoerrR
cbc0: 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20  etry ){.    if( 
cbd0: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
cbe0: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20  *pError = e;.   
cbf0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
cc00: 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52  .  }.  if( e==ER
cc10: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
cc20: 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  D ||.      e==ER
cc30: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
cc40: 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ON ||.      e==E
cc50: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
cc60: 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  LATION ){.    sq
cc70: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
cc80: 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  p(winIoerrRetryD
cc90: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
cca0: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
ccb0: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
ccc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
ccd0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
cce0: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
ccf0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cd00: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
cd10: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
cd20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
cd30: 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
cd40: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
cd50: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
cd60: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
cd70: 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c  ERR, .      "del
cd80: 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f  ayed %dms for lo
cd90: 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c  ck/sharing confl
cda0: 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49  ict",.      winI
cdb0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
cdc0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
cdd0: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
cde0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
cdf0: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
ce00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
ce40: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
ce50: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
ce60: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
ce70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ce80: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
ce90: 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
cea0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
ceb0: 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65  ME_API./*.** The
cec0: 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e   MSVC CRT on Win
ced0: 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20  dows CE may not 
cee0: 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
cef0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
cf00: 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62  .** create a sub
cf10: 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
cf20: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
cf30: 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
cf40: 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
cf50: 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
cf60: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
cf70: 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
cf80: 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
cf90: 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
cfa0: 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
cfb0: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
cfc0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
cfd0: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
cfe0: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
cff0: 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
d000: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
d010: 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
d020: 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
d030: 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
d040: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
d050: 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
d060: 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
d070: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
d080: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
d090: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
d0a0: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
d0b0: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
d0c0: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
d0d0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
d0e0: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
d0f0: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
d100: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
d110: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
d120: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
d130: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
d140: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
d150: 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
d160: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
d170: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
d180: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
d190: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
d1a0: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
d1b0: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
d1c0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
d1d0: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
d1e0: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
d1f0: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
d200: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
d210: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
d220: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
d230: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
d240: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
d250: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
d260: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
d270: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
d280: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
d290: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
d2a0: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
d2b0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
d2c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
d2d0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
d2e0: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
d2f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
d300: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
d310: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
d320: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
d330: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
d340: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
d350: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
d360: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
d370: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
d380: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
d390: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
d3a0: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
d3b0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
d3c0: 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
d3d0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
d3e0: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
d3f0: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
d400: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d410: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d420: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
d430: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
d440: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
d450: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
d460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
d470: 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c  ialize the local
d480: 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d   lockdata */.  m
d490: 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f  emset(&pFile->lo
d4a0: 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  cal, 0, sizeof(p
d4b0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a  File->local));..
d4c0: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
d4d0: 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f   backslashes fro
d4e0: 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  m the filename a
d4f0: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a  nd lowercase it.
d500: 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61    ** to derive a
d510: 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   mutex name. */.
d520: 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c    zTok = osCharL
d530: 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  owerW(zName);.  
d540: 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b  for (;*zTok;zTok
d550: 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54  ++){.    if (*zT
d560: 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f  ok == '\\') *zTo
d570: 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20  k = '_';.  }..  
d580: 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74  /* Create/open t
d590: 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a  he named mutex *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65  /.  pFile->hMute
d5b0: 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65  x = osCreateMute
d5c0: 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20  xW(NULL, FALSE, 
d5d0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70  zName);.  if (!p
d5e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
d5f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d600: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
d610: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
d620: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
d630: 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
d640: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d650: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
d660: 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c  eateLock1", zFil
d670: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  ename);.    sqli
d680: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
d690: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d6a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20  TE_IOERR;.  }.. 
d6b0: 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
d6c0: 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e  mutex before con
d6d0: 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  tinuing */.  win
d6e0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
d6f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d700: 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65   .  /* Since the
d710: 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
d720: 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
d730: 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
d740: 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a  gs etc are .  **
d750: 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c   case-sensitive,
d760: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
d770: 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72  of that by upper
d780: 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  casing the mutex
d790: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75   name.  ** and u
d7a0: 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65  sing that as the
d7b0: 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70   shared filemapp
d7c0: 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  ing name..  */. 
d7d0: 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e   osCharUpperW(zN
d7e0: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
d7f0: 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74  Shared = osCreat
d800: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e  eFileMappingW(IN
d810: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
d820: 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  UE, NULL,.      
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
d860: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
d870: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
d8b0: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
d8c0: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
d8d0: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
d8e0: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
d8f0: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
d900: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
d910: 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
d920: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
d930: 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
d940: 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
d950: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
d960: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
d970: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
d980: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
d990: 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
d9a0: 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
d9b0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
d9c0: 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
d9d0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
d9e0: 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
d9f0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
da00: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
da10: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
da20: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
da30: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
da40: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
da50: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
da60: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
da70: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
da80: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
da90: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
daa0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
dab0: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
dac0: 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
dad0: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
dae0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
daf0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
db00: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
db10: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
db20: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
db30: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
db40: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
db50: 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
db60: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
db70: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
db80: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
db90: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
dba0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
dbb0: 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
dbc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
dbd0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
dbe0: 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
dbf0: 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
dc00: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
dc10: 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
dc20: 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
dc30: 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
dc40: 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
dc50: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dc60: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
dc70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
dc80: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
dc90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
dcb0: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
dcc0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
dcd0: 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
dce0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
dcf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
dd00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
dd10: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
dd20: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
dd30: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
dd40: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
dd50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
dd60: 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  OERR;.  }.  .  /
dd70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
dd80: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
dd90: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
dda0: 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e   to */.  if( bIn
ddb0: 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it ){.    memset
ddc0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
ddd0: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
dde0: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
ddf0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
de00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
de10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  OK;.}../*.** Des
de30: 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66  troy the part of
de40: 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65   winFile that de
de50: 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c  als with wince l
de60: 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ocks.*/.static v
de70: 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79  oid winceDestroy
de80: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
de90: 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c  ile){.  if (pFil
dea0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
deb0: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
dec0: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
ded0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
dee0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
def0: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
df00: 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c  ing blocks shoul
df10: 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72  d probably asser
df20: 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  t in debug mode,
df30: 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20   but they.      
df40: 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20   are to cleanup 
df50: 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b  in case any lock
df60: 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20  s remained open 
df70: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
df80: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
df90: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
dfa0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
dfb0: 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   --;.    }.    i
dfc0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
dfd0: 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20  bReserved){.    
dfe0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
dff0: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
e000: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
e010: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
e020: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
e030: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e040: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
e050: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
e060: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
e070: 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70  lusive){.      p
e080: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
e090: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
e0a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e0b0: 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64  De-reference and
e0c0: 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20   close our copy 
e0d0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  of the shared me
e0e0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  mory handle */. 
e0f0: 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66     osUnmapViewOf
e100: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
e110: 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ed);.    osClose
e120: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
e130: 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  hared);..    /* 
e140: 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
e150: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
e160: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
e170: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20  le->hMutex);    
e180: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
e190: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
e1a0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
e1b0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
e1c0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
e1d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
e1e0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
e1f0: 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
e200: 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
e210: 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  OOL winceLockFil
e220: 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
e230: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
e240: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
e250: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
e260: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
e270: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e280: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
e290: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
e2a0: 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
e2b0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
e2c0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
e2d0: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
e2e0: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
e2f0: 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  SE;..  UNUSED_PA
e300: 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66  RAMETER(dwFileOf
e310: 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55  fsetHigh);.  UNU
e320: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
e330: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e340: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
e350: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
e360: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
e370: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
e380: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e390: 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61  ..  /* Wanting a
e3a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e3b0: 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  ? */.  if (dwFil
e3c0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
e3d0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
e3e0: 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d  T.       && nNum
e3f0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e400: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
e410: 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
e420: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
e430: 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  d->nReaders == 0
e440: 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65   && pFile->share
e450: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
e460: 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c   0){.       pFil
e470: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
e480: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
e490: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e4a0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  l.bExclusive = T
e4b0: 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74  RUE;.       bRet
e4c0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e4d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
e4e0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63   a read-only loc
e4f0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
e500: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e510: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e520: 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
e530: 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42        nNumberOfB
e540: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
e550: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
e560: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
e570: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
e580: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e590: 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  .nReaders ++;.  
e5a0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
e5b0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
e5c0: 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69   1){.        pFi
e5d0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e5e0: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d  ders ++;.      }
e5f0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e600: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e610: 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65  ..  /* Want a pe
e620: 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  nding lock? */. 
e630: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
e640: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e650: 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
e660: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
e670: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
e680: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
e690: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69    /* If no pendi
e6a0: 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
e6b0: 20 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20   acquired, then 
e6c0: 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20  acquire it */.  
e6d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
e6e0: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d  red->bPending ==
e6f0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
e700: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
e710: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
e720: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e730: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
e740: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e750: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e760: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73  .  /* Want a res
e770: 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  erved lock? */. 
e780: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
e790: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e7a0: 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
e7b0: 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
e7c0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e7d0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
e7e0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
e7f0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
e800: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
e810: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
e820: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
e830: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e840: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
e850: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
e860: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e870: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
e880: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
e890: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
e8a0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
e8b0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
e8c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
e8d0: 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57  ockFile API of W
e8e0: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
e8f0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
e900: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  ceUnlockFile(.  
e910: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
e920: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
e930: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
e940: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
e950: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
e960: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e970: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
e980: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
e990: 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
e9a0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
e9b0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
e9c0: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
e9d0: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
e9e0: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
e9f0: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
ea00: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
ea10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
ea20: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
ea30: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
ea40: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
ea50: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
ea60: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
ea70: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
ea80: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
ea90: 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
eaa0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
eab0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
eac0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
ead0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
eae0: 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
eaf0: 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
eb00: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
eb10: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
eb20: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
eb30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
eb40: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
eb50: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
eb60: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
eb70: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
eb80: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
eb90: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
eba0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
ebb0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
ebc0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
ebd0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
ebe0: 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
ebf0: 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
ec00: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
ec10: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ec20: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
ec30: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
ec40: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ec50: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
ec60: 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20  ARED_SIZE.      
ec70: 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65         || nNumbe
ec80: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ec90: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
eca0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
ecb0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
ecc0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ecd0: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
ece0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
ecf0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
ed00: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
ed10: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
ed20: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
ed30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
ed40: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
ed50: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
ed60: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
ed70: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
ed80: 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
ed90: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
eda0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
edb0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
edc0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
edd0: 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
ede0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
edf0: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
ee00: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
ee10: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
ee20: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
ee30: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
ee40: 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69    }.  /* Releasi
ee50: 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ng a reserved lo
ee60: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
ee70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
ee80: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
ee90: 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
eea0: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
eeb0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
eec0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
eed0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
eee0: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
eef0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
ef00: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
ef10: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
ef20: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
ef30: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
ef40: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
ef50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
ef60: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
ef70: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
ef80: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
ef90: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
efa0: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
efb0: 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
f010: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
f020: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  E */../*.** Lock
f030: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
f040: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
f050: 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  inLockFile(.  LP
f060: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
f070: 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20   DWORD flags,.  
f080: 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
f090: 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
f0a0: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
f0b0: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
f0c0: 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
f0d0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
f0e0: 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
f0f0: 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
f100: 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
f110: 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
f120: 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
f130: 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
f140: 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a    API LockFile..
f150: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
f160: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
f170: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
f180: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
f1b0: 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
f1c0: 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
f1d0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
f1e0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
f1f0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
f200: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
f210: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
f220: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
f230: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
f240: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
f250: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
f260: 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
f270: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
f280: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
f290: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
f2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f2b0: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
f2c0: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
f2d0: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
f2e0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
f310: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
f320: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
f330: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
f340: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
f350: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
f360: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
f370: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
f380: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
f390: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
f3a0: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
f3b0: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
f3c0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
f3d0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
f3e0: 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
f3f0: 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
f400: 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
f410: 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
f420: 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
f430: 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
f440: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
f450: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
f460: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
f470: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
f4a0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
f4b0: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
f4c0: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
f4d0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
f4e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
f4f0: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
f500: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
f510: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
f520: 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
f530: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
f540: 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
f550: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
f560: 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c  leEx(*phFile, 0,
f570: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
f580: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
f590: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
f5a0: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
f5b0: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
f5c0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
f5d0: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
f5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f5f0: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
f600: 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
f610: 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dif.}../********
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f660: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
f670: 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
f680: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
f690: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
f6a0: 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
f6b0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
f6c0: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f720: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
f730: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
f740: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
f750: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
f760: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
f770: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
f780: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f790: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
f7a0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
f7b0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
f7c0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
f7d0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
f7e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f7f0: 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
f800: 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
f810: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
f820: 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
f830: 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
f840: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
f850: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f860: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
f870: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
f880: 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  int winSeekFile(
f890: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
f8a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
f8b0: 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c  ffset){.#if !SQL
f8c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c  ITE_OS_WINRT.  L
f8d0: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8f0: 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
f900: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
f910: 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
f920: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f930: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
f940: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
f950: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f960: 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
f990: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
f9a0: 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44  ter() */.  DWORD
f9b0: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
f9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f9d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f9e0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
f9f0: 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  /..  OSTRACE(("S
fa00: 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66  EEK file=%p, off
fa10: 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69  set=%lld\n", pFi
fa20: 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29  le->h, iOffset))
fa30: 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d  ;..  upperBits =
fa40: 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74   (LONG)((iOffset
fa50: 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
fa60: 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  ff);.  lowerBits
fa70: 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65   = (LONG)(iOffse
fa80: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
fa90: 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74  ..  /* API oddit
faa0: 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  y: If successful
fab0: 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  , SetFilePointer
fac0: 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f  () returns a dwo
fad0: 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  rd .  ** contain
fae0: 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
faf0: 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
fb00: 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
fb10: 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
fb20: 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
fb30: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
fb40: 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
fb50: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
fb60: 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  DN, .  ** INVALI
fb70: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
fb80: 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
fb90: 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
fba0: 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
fbb0: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
fbc0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63   an error has ac
fbd0: 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c  tually occurred,
fbe0: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
fbf0: 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
fc00: 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
fc10: 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
fc20: 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
fc30: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
fc40: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
fc50: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
fc60: 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
fc70: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
fc80: 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
fc90: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
fca0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
fcb0: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
fcc0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
fcd0: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
fce0: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
fcf0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
fd00: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
fd10: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fd20: 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
fd30: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
fd40: 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
fd50: 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
fd60: 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
fd70: 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
fd80: 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
fd90: 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
fda0: 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
fdb0: 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
fdc0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
fdd0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
fde0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
fdf0: 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
fe00: 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
fe10: 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
fe20: 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
fe30: 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
fe40: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
fe50: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
fe60: 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
fe70: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
fe90: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
fea0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
feb0: 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
fec0: 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
fed0: 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
fee0: 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
fef0: 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
ff00: 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
ff10: 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
ff20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
ff30: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ff40: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
ff50: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
ff60: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ff70: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ff80: 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
ff90: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
ffa0: 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
ffb0: 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
ffc0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
ffd0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
ffe0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
fff0: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
10000 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
10010 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
10020 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
10030 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  n 0;.#endif.}..#
10040 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10050 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72  AP_SIZE>0./* For
10060 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
10070 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
10080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10090 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
100a0 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
100b0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
100c0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
100d0 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
100e0 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
100f0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
10100 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
10110 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
10120 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
10130 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
10140 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
10150 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
10160 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
10170 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
10180 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
10190 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
101a0 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
101b0 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
101c0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
101d0 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
101e0 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
101f0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
10200 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
10210 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
10220 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
10230 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
10240 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
10250 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
10260 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
10270 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
10280 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
10290 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
102a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
102b0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
102c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
102d0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
102e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
102f0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
10300 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
10310 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10320 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
10330 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
10340 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
10350 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
10360 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
10370 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
10380 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
10390 45 3e 30 0a 20 20 72 63 20 3d 20 77 69 6e 55 6e  E>0.  rc = winUn
103a0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
103b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
103c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
103d0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
103e0 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
103f0 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
10400 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
10410 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
10420 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
10430 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
10440 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
10450 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
10460 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
10470 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
10480 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
10490 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
104a0 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
104b0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
104c0 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
104d0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
104e0 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
104f0 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
10500 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
10510 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
10520 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
10530 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
10540 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
10550 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
10560 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
10570 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
10580 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
10590 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
105a0 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
105b0 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
105c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
105d0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
105e0 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
105f0 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
10600 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
10610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10620 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
10630 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
10640 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
10650 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
10660 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
10670 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
10680 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
10690 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
106a0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20   pFile->h, rc ? 
106b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
106c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
106d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
106e0 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
106f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10700 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
10710 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
10740 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
10750 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
10760 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
10770 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
10780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10790 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
107a0 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
107b0 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
107c0 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
107d0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
107e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
107f0 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
10800 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
10810 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
10820 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
10830 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
10840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10850 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
10860 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
10870 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10890 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
108a0 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
108b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
108c0 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
108d0 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
108e0 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
108f0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10900 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
10910 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
10920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
10930 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
10940 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
10950 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10960 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
10970 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
10980 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
109b0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
109c0 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
109d0 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
109e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
10a00 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
10a10 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
10a20 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
10a30 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
10a40 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
10a50 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
10a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10a70 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
10a80 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75  READ file=%p, bu
10a90 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
10aa0 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
10ab0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
10ac0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
10ad0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
10ae0 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
10af0 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
10b00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
10b10 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
10b20 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
10b30 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
10b40 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
10b50 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
10b60 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
10b70 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
10b80 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
10b90 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
10ba0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
10bb0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
10bc0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
10bd0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
10be0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
10bf0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
10c00 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
10c10 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  ], amt);.      O
10c20 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d  STRACE(("READ-MM
10c30 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
10c40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
10c50 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
10c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10c80 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
10c90 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
10ca0 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
10cb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
10cc0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
10cd0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
10ce0 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
10cf0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
10d00 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
10d10 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
10d20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
10d30 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
10d40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
10d50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
10d60 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65  NCE.  if( winSee
10d70 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
10d80 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
10d90 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
10da0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
10db0 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  LL\n", pFile->h)
10dc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10dd0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
10de0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
10df0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
10e00 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
10e10 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
10e20 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
10e30 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
10e40 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
10e50 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
10e60 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
10e70 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
10e80 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10e90 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
10ea0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
10eb0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
10ec0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
10ed0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
10ee0 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
10ef0 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
10f00 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
10f10 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
10f20 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
10f30 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
10f40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
10f50 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
10f60 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
10f70 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
10f80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10f90 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
10fa0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
10fb0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
10fc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10fd0 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
10fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
10ff0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11000 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
11010 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11020 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
11030 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
11040 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f  th);.  }.  winLo
11050 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
11060 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
11070 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
11080 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
11090 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
110a0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
110b0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
110c0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
110d0 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
110e0 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  d);.    OSTRACE(
110f0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
11100 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
11110 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70  SHORT_READ\n", p
11120 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11140 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
11150 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
11160 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
11170 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
11180 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
11190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
111a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
111b0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
111c0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
111d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
111e0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
111f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
11200 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
11210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11220 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
11230 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11250 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
11260 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
11270 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
11280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
11290 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
112a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
112d0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
112e0 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
112f0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11310 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
11320 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
11330 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
11340 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11360 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
11370 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
11380 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
11390 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
113a0 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
113b0 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
113c0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
113f0 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
11400 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
11410 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11420 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11430 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
11440 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
11450 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
11460 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
11470 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
11480 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
11490 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
114a0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73   amount=%d, offs
114b0 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
114c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
114d0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
114e0 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
114f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
11500 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
11510 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
11520 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
11530 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
11540 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
11550 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
11560 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
11570 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
11580 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
11590 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
115a0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
115b0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
115c0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
115d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
115e0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
115f0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
11600 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
11610 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
11620 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
11630 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c  ("WRITE-MMAP fil
11640 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11650 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
11660 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11680 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11690 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
116a0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
116b0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
116c0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
116d0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
116e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
116f0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
11700 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
11710 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
11720 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
11730 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
11740 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
11750 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
11760 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11770 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65  rc = winSeekFile
11780 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b  (pFile, offset);
11790 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
117a0 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66  #else.  {.#endif
117b0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
117c0 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41  WINCE.    OVERLA
117d0 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
117e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
117f0 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
11800 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
11810 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
11820 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
11830 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
11840 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
11850 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
11860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
11880 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
11890 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
118a0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
118b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
118c0 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
118d0 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
118e0 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
118f0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
11900 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
11910 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
11920 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
11930 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
11940 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74  WINCE.    memset
11950 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
11960 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
11970 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  ED));.    overla
11980 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
11990 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
119a0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f  ffffffff);.    o
119b0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
119c0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
119d0 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
119e0 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
119f0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
11a00 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  m>0 ){.#if SQLIT
11a10 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
11a20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
11a30 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
11a40 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
11a50 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
11a60 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
11a70 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
11a80 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
11a90 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
11aa0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
11ab0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
11ac0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
11ad0 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
11ae0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
11af0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11b00 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
11b10 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
11b20 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
11b30 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
11b40 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
11b50 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
11b60 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
11b70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11b80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11b90 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
11ba0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
11bb0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
11bc0 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
11bd0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
11be0 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
11bf0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
11c00 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
11c10 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
11c20 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
11c30 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
11c40 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
11c50 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
11c60 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
11c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
11c80 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
11c90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11ca0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
11cb0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
11cc0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
11cd0 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
11ce0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
11cf0 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
11d00 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
11d10 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
11d20 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
11d30 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
11d40 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
11d50 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11d60 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c  TE_FULL\n", pFil
11d70 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
11d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
11da0 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
11db0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
11dc0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
11dd0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11de0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
11df0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
11e00 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
11e10 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11e20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c       "winWrite",
11e30 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e    }else{.    win
11e50 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  LogIoerr(nRetry)
11e60 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
11e70 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
11e80 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
11e90 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
11ec0 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
11ed0 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
11ee0 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
11ef0 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
11f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11f10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
11f20 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
11f30 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11f40 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
11f50 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
11f60 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11f70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
11f80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11f90 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
11fa0 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
11fb0 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
11fc0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11fd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11fe0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
11ff0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
12000 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
12010 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 73 69  CATE file=%p, si
12020 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  ze=%lld, lock=%d
12030 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12040 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
12050 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12060 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
12070 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
12080 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
12090 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
120a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
120b0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
120c0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
120d0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
120e0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
120f0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
12100 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
12110 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
12120 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
12130 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
12140 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
12150 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
12160 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
12170 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
12180 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
12190 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
121a0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
121b0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
121c0 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
121d0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
121e0 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
121f0 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
12200 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
12210 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
12220 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
12230 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
12240 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12250 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
12260 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
12290 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
122a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
122b0 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
122c0 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20  File->h) &&.    
122d0 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72          ((lastEr
122e0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
122f0 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55  rror())!=ERROR_U
12300 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29  SER_MAPPED_FILE)
12310 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12320 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12330 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77  rrno;.    rc = w
12340 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12350 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
12360 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
12370 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12380 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
12390 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
123a0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66  zPath);.  }..#if
123b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
123c0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20  _SIZE>0.  /* If 
123d0 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75  the file was tru
123e0 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
123f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
12400 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
12410 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
12420 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
12430 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
12440 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
12450 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20  e will.  ** use 
12460 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
12470 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
12480 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
12490 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
124a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
124b0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26  e->pMapRegion &&
124c0 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
124d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46  apSize ){.    pF
124e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
124f0 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  nByte;.  }.#endi
12500 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  f..  OSTRACE(("T
12510 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c  RUNCATE file=%p,
12520 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
12530 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
12540 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
12550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
12560 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
12570 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
12580 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
12590 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
125a0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
125b0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
125c0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
125d0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
125e0 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
125f0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
12600 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
12610 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
12620 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
12630 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
12640 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
12650 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
12660 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
12670 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
12680 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
12690 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
126a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
126b0 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
126c0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
126d0 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
126e0 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
126f0 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
12700 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
12710 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
12720 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
12730 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
12740 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
12750 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e   || \.    (defin
12760 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
12770 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
12780 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20  E_DEBUG)).  /*. 
12790 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51   ** Used when SQ
127a0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
127b0 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20  not defined and 
127c0 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20  by the assert() 
127d0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52  and/or.  ** OSTR
127e0 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  ACE() macros..  
127f0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
12800 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
12810 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
12820 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
12830 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
12840 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12850 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
12860 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
12870 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
12880 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
12890 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
128a0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
128b0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
128c0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
128d0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
128e0 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
128f0 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
12900 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
12910 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
12920 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
12930 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
12940 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
12950 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
12960 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
12970 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
12980 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
12990 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
129a0 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
129b0 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66  "SYNC file=%p, f
129c0 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64  lags=%x, lock=%d
129d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
129e0 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c  pFile->h, flags,
129f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12a00 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
12a10 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
12a20 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
12a30 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
12a40 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
12a50 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
12a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
12a70 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
12a80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
12a90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
12aa0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
12ab0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
12ac0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
12ad0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
12ae0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
12af0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
12b00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
12b10 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
12b20 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  OP file=%p, rc=S
12b30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12b40 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
12b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
12b60 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
12b70 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
12b80 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
12b90 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
12ba0 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
12bb0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
12bc0 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72  "SYNC file=%p, r
12bd0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
12be0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12c10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12c20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12c30 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  ();.    OSTRACE(
12c40 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
12c50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12c60 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65 2d  FSYNC\n", pFile-
12c70 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12c80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12c90 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
12ca0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12cb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12cc0 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
12cd0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
12ce0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
12cf0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
12d00 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
12d10 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
12d20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
12d30 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
12d40 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
12d50 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
12d60 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12d70 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
12d80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d90 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
12da0 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
12db0 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
12dc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12dd0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
12de0 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
12df0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
12e00 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
12e10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
12e20 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
12e30 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
12e40 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
12e50 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
12e60 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
12e70 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
12e80 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
12e90 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
12ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
12ed0 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
12ee0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
12ef0 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
12f00 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
12f10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12f20 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
12f30 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
12f40 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
12f50 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12f60 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
12f70 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
12fa0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12fb0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
12fc0 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
12fd0 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
12fe0 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
12ff0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13000 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
13010 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
13020 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
13030 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
13040 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
13050 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
13060 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
13070 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
13080 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
13090 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
130a0 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
130b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
130c0 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
130d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
130e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
130f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
13100 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
13110 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
13120 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
13130 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13140 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
13150 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13160 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13170 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
13180 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
13190 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
131a0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
131b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
131c0 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
131d0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
131e0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
131f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
13200 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
13210 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
13220 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
13230 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
13240 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
13250 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
13260 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
13270 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
13280 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
13290 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
132a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
132b0 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
132c0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
132d0 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
132e0 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
132f0 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
13300 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
13310 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
13320 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
13330 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
13340 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
13350 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
13360 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
13370 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
13380 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
13390 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
133a0 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
133b0 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
133c0 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
133d0 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
133e0 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
133f0 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
13400 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
13410 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
13420 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
13430 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
13440 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
13450 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
13460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
13470 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
13480 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
13490 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
134a0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
134b0 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
134e0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
134f0 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
13500 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
13510 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
13520 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
13530 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
13540 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
13550 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
13560 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
13570 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
13580 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
13590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
135a0 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
135b0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
135c0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
135d0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
135e0 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
135f0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
13600 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
13610 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
13620 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
13630 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
13640 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13650 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
13660 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
13670 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
13680 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
13690 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
136a0 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
136b0 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
136c0 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
136d0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
136e0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
136f0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
13700 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13710 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
13720 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
13730 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
13740 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
13750 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
13760 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
13770 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
13780 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
13790 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
137a0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
137b0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
137c0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
137d0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
137e0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
137f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
13800 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
13810 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
13830 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
13840 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
13850 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
13860 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
13870 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
13880 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
13890 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
138a0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
138b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
138c0 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
138d0 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
138e0 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
138f0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
13900 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
13910 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
13920 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
13930 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
13940 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
13950 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
13960 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
13970 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
13980 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
13990 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
139a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
139b0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
139c0 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
139d0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
139e0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
139f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
13a00 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
13a10 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
13a20 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  res)));.  return
13a30 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
13a40 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
13a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13a60 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
13a70 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
13a80 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
13a90 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
13aa0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
13ab0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
13ac0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
13ad0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
13ae0 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
13af0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
13b00 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
13b10 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
13b20 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
13b30 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
13b40 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13b50 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
13b60 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
13b70 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
13b80 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
13b90 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
13ba0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
13bb0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
13bc0 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
13bd0 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
13be0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13bf0 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
13c00 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
13c10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13c20 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13c30 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13c40 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
13c50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13c60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13c70 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f  "winUnlockReadLo
13c80 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
13c90 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  h);.  }.  OSTRAC
13ca0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
13cb0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
13cc0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
13cd0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
13ce0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
13cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13d00 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13d10 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
13d20 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
13d30 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
13d40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
13d60 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
13d70 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
13d80 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
13d90 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
13da0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
13db0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
13dc0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
13dd0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
13de0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
13df0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
13e00 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
13e10 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
13e20 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
13e30 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
13e40 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
13e50 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
13e60 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
13e70 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
13e80 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
13e90 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
13ea0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
13eb0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
13ec0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
13ed0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
13ee0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
13ef0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
13f00 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
13f10 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
13f20 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13f30 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
13f40 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
13f50 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13f60 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
13f70 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13f80 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13f90 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
13fa0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
13fb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
13fc0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
13fd0 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
13fe0 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
13ff0 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
14000 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
14010 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
14020 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
14030 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
14040 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
14050 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
14060 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
14070 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
14080 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
14090 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
140a0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
140b0 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
140c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
140d0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
140e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
140f0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
14100 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
14110 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
14120 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
14130 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14140 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
14150 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
14160 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
14170 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
14180 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
14190 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
141a0 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
141b0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
141c0 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
141d0 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
141e0 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
141f0 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
14200 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14210 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
14220 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
14230 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
14240 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
14250 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d  ACE(("LOCK file=
14260 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25  %p, oldLock=%d(%
14270 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e  d), newLock=%d\n
14280 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14290 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
142a0 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
142b0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
142c0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
142d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
142e0 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
142f0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
14300 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
14310 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
14320 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
14330 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
14340 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
14350 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
14360 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
14370 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14380 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14390 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
143a0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
143b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
143c0 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20  K-HELD file=%p, 
143d0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
143e0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
143f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14400 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
14410 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
14420 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
14430 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
14440 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
14450 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
14460 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
14470 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
14480 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
14490 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
144a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
144b0 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
144c0 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
144d0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
144e0 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
144f0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
14500 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
14510 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
14520 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
14530 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
14540 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
14550 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
14560 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
14570 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
14580 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
14590 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
145a0 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
145b0 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
145c0 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28  ktype;.  if(   (
145d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
145e0 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c  =NO_LOCK).     |
145f0 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d  | (   (locktype=
14600 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
14610 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46  .         && (pF
14620 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
14630 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20  ESERVED_LOCK)). 
14640 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
14650 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
14660 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
14670 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
14680 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
14690 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47           PENDING
146d0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
146e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
146f0 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
14700 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
14710 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ock.  This is ne
14720 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20  eded to work.   
14730 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f     ** around pro
14740 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
14750 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20  indexing and/or 
14760 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77  anti-virus softw
14770 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  are on.      ** 
14780 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
14790 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75  .      ** If you
147a0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
147b0 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20  code as a model 
147c0 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  for alternative 
147d0 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20  VFSes, do not.  
147e0 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73      ** copy this
147f0 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49   retry logic.  I
14800 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65  t is a hack inte
14810 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73  nded for Windows
14820 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a   only..      */.
14830 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
14840 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49  LOCK-PENDING-FAI
14850 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
14860 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
14880 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c  ile->h, cnt, sql
14890 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
148a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  ));.      if( cn
148b0 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t ) sqlite3_win3
148c0 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  2_sleep(1);.    
148d0 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
148e0 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
148f0 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
14900 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
14910 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
14920 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14930 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
14940 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
14950 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
14960 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
14970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
14980 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
14990 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
149a0 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63   = winGetReadLoc
149b0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
149c0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
149d0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
149e0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
149f0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
14a00 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14a10 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
14a20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
14a30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
14a50 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
14a60 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
14a70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14a80 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
14a90 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
14aa0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
14ab0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
14ac0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14ad0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14ae0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
14af0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
14b00 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
14b10 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
14b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
14b30 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14b40 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14b50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
14b60 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
14b70 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
14b80 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
14b90 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
14ba0 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
14bb0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
14bc0 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
14bd0 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
14be0 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
14bf0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
14c00 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
14c10 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14c20 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
14c30 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
14c40 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  cktype>=SHARED_L
14c50 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
14c60 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
14c70 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72  ck(pFile);.    r
14c80 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
14c90 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
14ca0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
14cb0 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
14cc0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14cd0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
14ce0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
14cf0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
14d00 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
14d10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
14d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
14d30 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14d40 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14d50 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63     winGetReadLoc
14d60 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
14d70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
14d80 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
14d90 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
14da0 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
14db0 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
14dc0 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
14dd0 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
14de0 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
14df0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14e00 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
14e10 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14e20 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
14e30 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
14e40 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
14e50 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
14e60 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
14e70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
14e80 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
14e90 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
14ea0 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
14eb0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
14ec0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14ed0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
14ee0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14ef0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
14f00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14f10 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41  _BUSY;.    OSTRA
14f20 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66  CE(("LOCK-FAIL f
14f30 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25  ile=%p, wanted=%
14f40 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20  d, got=%d\n",.  
14f50 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14f60 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e  ->h, locktype, n
14f70 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
14f80 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
14f90 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
14fa0 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
14fb0 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
14fc0 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
14fd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
14fe0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
14ff0 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
15000 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
15010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15020 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15030 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
15040 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
15050 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
15060 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
15070 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
15080 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
15090 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
150a0 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
150b0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
150c0 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
150d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
150e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
150f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15100 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15110 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69  {.  int rc;.  wi
15120 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
15130 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
15140 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15160 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
15170 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54  EDLOCK; );.  OST
15180 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15190 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
151a0 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  sOut=%p\n", pFil
151b0 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b  e->h, pResOut));
151c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
151d0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
151e0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
151f0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
15200 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
15210 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15220 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
15230 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
15240 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
15250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15260 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
15270 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
15280 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
15290 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
152a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
152b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e   rc ){.      win
152c0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
152d0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
152e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
152f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
15300 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  c;.    OSTRACE((
15310 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
15320 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65  le=%p, rc=%d (re
15330 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
15340 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20  >h, rc));.  }.  
15350 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
15360 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
15370 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
15380 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
15390 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
153a0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
153b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
153c0 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
153d0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
153e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
15400 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
15410 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
15420 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
15430 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
15440 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
15450 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
15460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
15470 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
15480 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
154a0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
154b0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
154c0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
154d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
154e0 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
154f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
15500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
15510 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
15520 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
15530 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
15540 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15550 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
15560 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
15570 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
15580 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15590 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
155a0 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
155b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
155c0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
155d0 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
155e0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
155f0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
15600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15610 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
15620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
15630 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
15640 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
15650 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
15660 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
15670 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
15680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15690 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
156a0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
156b0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
156c0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70  ocktype));.  typ
156d0 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
156e0 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
156f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15700 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
15710 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
15720 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
15730 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
15740 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
15750 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
15760 26 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f  && !winGetReadLo
15770 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
15780 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
15790 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
157a0 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
157b0 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
157c0 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
157d0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
157e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
157f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15800 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
15810 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15830 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
15840 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15850 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
15860 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
15870 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
15880 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
15890 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
158a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
158b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
158c0 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
158d0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
158e0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
158f0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
15900 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
15910 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
15920 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15930 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
15940 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
15950 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
15960 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
15970 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
15980 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
15990 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
159a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
159b0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
159c0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
159d0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
159e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
159f0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
15a00 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
15a10 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
15a20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
15a30 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
15a40 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
15a50 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
15a60 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
15a70 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
15a80 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
15a90 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
15aa0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
15ab0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
15ac0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
15ad0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
15ae0 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
15af0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
15b00 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
15b10 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
15b20 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
15b30 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
15b40 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
15b50 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
15b60 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
15b70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
15b80 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
15b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
15ba0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
15bb0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
15bc0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15bd0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
15be0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
15bf0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
15c00 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 23 69 66 20  , char **);.#if 
15c10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
15c20 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
15c30 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
15c40 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  File*, sqlite3_i
15c50 6e 74 36 34 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  nt64);.#endif../
15c60 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
15c70 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
15c80 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
15c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
15ca0 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
15cb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15cc0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
15cd0 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
15ce0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15cf0 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  )id;.  OSTRACE((
15d00 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15d10 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e  op=%d, pArg=%p\n
15d20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c  ", pFile->h, op,
15d30 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63   pArg));.  switc
15d40 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
15d50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
15d60 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
15d70 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
15d80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
15d90 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15da0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15db0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15dc0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15dd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15de0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
15df0 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
15e00 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
15e10 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
15e20 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
15e30 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  no;.      OSTRAC
15e40 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
15e50 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
15e60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
15e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15e80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
15e90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15ea0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
15eb0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
15ec0 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
15ed0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54  )pArg;.      OST
15ee0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
15ef0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15f00 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
15f10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15f30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15f40 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
15f50 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
15f60 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
15f70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15f80 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
15f90 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
15fa0 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
15fb0 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
15fc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15fd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15fe0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
15ff0 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
16000 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
16010 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
16020 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
16030 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16040 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16050 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
16060 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
16070 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
16080 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
16090 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
160a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
160b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54     }.        OST
160c0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
160d0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
160e0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
160f0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
16100 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16110 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16120 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
16130 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16140 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
16150 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
16160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16170 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
16180 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
16190 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
161a0 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
161b0 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
161c0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
161d0 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
161e0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
161f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
16200 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
16210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16230 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
16240 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
16250 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
16260 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
16270 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
16280 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
16290 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
162a0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
162b0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
162c0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
162d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
162f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
16300 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
16310 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
16320 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16330 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 4f  win32");.      O
16340 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
16350 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16360 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
16370 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
16380 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
16390 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
163a0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
163b0 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20  V_RETRY: {.     
163c0 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29   int *a = (int*)
163d0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
163e0 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[0]>0 ){.      
163f0 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20    winIoerrRetry 
16400 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[0];.      }e
16410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30  lse{.        a[0
16420 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
16430 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
16440 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20   if( a[1]>0 ){. 
16450 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
16460 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d  etryDelay = a[1]
16470 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16480 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69         a[1] = wi
16490 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
164a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
164b0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
164c0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
164d0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
164e0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
164f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16500 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
16510 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
16520 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
16530 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30  char *zTFile = 0
16540 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
16550 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
16560 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54  pFile->pVfs, &zT
16570 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
16580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16590 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  {.        *(char
165a0 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
165b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
165c0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
165d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 5c 6e  file=%p, rc=%d\n
165e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
165f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16600 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  rc;.    }.#if SQ
16610 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
16620 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
16630 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
16640 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
16650 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
16660 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
16670 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16680 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
16690 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
166a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
166b0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
166c0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
166d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
166e0 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
166f0 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
16700 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
16710 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
16720 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
16730 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
16740 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
16750 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
16760 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
16770 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
16780 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
16790 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
167a0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
167b0 20 20 20 20 20 20 28 76 6f 69 64 29 77 69 6e 55        (void)winU
167c0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
167d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
167e0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
167f0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
16800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
16810 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
16820 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 5c 6e 22  ile=%p, rc=%d\n"
16830 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29  , pFile->h, rc))
16840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16850 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
16860 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16870 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
16880 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
16890 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
168a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
168b0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
168c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
168d0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
168e0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
168f0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
16900 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
16910 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
16920 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
16930 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
16940 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
16950 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
16960 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
16970 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
16980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
16990 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
169a0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
169b0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
169c0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
169d0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
169e0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
169f0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
16a00 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
16a10 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
16a20 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
16a30 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
16a40 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
16a50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
16a60 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
16a70 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
16a80 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
16a90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
16aa0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
16ab0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
16ac0 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
16ad0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
16ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16af0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
16b00 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
16b10 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
16b20 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
16b30 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
16b40 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
16b50 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
16b60 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
16b70 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
16b80 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
16b90 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
16ba0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
16bb0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  ;.}../* .** Wind
16bc0 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
16bd0 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
16be0 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
16bf0 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
16c00 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
16c10 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
16c20 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
16c30 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
16c40 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
16c50 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
16c60 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
16c70 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
16c80 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
16c90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ca0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
16cb0 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
16cc0 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
16cd0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
16ce0 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
16cf0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
16d00 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
16d10 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
16d20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
16d30 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
16d40 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
16d50 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
16d60 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
16d70 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
16d80 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
16d90 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
16da0 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
16db0 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
16dc0 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
16dd0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
16de0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
16df0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
16e00 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
16e10 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
16e20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
16e30 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
16e40 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
16e50 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
16e60 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
16e70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
16e80 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
16e90 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
16ea0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
16eb0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16ec0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
16ed0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
16ee0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
16ef0 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
16f00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
16f10 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
16f20 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16f30 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
16f40 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
16f50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
16f60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
16f70 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
16f80 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
16f90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
16fa0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
16fb0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
16fc0 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
16fd0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
16fe0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
16ff0 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
17000 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
17010 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
17020 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
17030 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
17040 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
17050 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
17060 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
17070 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
17080 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
17090 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
170a0 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
170b0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
170c0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
170d0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
170e0 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
170f0 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
17100 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
17110 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
17120 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
17130 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
17140 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
17150 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
17160 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
17170 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
17180 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
17190 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
171a0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
171b0 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
171c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
171d0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
171e0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
171f0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
17200 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
17210 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
17220 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
17230 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
17240 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
17250 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
17260 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
17270 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
17280 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
17290 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
172a0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
172b0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
172c0 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
172d0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
172e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
172f0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
17300 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
17310 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
17320 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
17330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17340 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
17350 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
17360 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
17370 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
17380 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
17390 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
173b0 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
173c0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
173d0 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173f0 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
17400 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
17410 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
17420 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
17430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17440 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
17450 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
17460 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
17470 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
17480 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
17490 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
174a0 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
174b0 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
174c0 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
174d0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
174f0 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
17500 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
17510 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
17520 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
17530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
17540 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
17550 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
17560 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
17570 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
17580 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
17590 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
175a0 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
175b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
175c0 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
175d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
175e0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
175f0 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
17600 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
17610 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
17620 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
17630 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
17640 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
17650 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
17660 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
17670 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
17680 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
17690 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
176a0 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
176b0 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
176c0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
176d0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
176e0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
176f0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
17700 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
17710 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
17720 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
17730 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
17740 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
17750 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
17760 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
17770 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
17780 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
17790 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
177a0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
177b0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
177c0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
177d0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
177e0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
177f0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
17800 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
17810 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
17820 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
17830 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
17840 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
17850 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
17860 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
17870 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
17880 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
17890 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
178a0 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
178b0 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
178c0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
178d0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
178e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
178f0 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
17900 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
17910 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
17920 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
17930 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
17940 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
17950 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
17960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
17970 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
17980 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
17990 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
179a0 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
179d0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
179e0 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
179f0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
17a00 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
17a10 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
17a20 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
17a30 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
17a40 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
17a50 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
17a60 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
17a70 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
17a80 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
17a90 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
17aa0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
17ab0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
17ac0 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
17ad0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
17ae0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
17af0 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
17b00 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
17b10 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
17b20 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
17b30 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
17b40 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
17b50 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
17b60 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
17b70 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
17b80 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
17b90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
17ba0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
17bb0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
17bc0 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
17bd0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
17be0 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
17bf0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
17c00 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
17c10 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
17c20 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
17c30 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c50 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17c60 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
17c70 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
17c80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17c90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
17ca0 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
17cb0 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
17cc0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
17cd0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
17ce0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
17cf0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
17d00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17d10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
17d20 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
17d30 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
17d40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
17d50 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
17d60 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
17d70 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
17d80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17d90 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
17da0 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
17db0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
17dc0 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
17dd0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
17de0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
17df0 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
17e00 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f      rc = winUnlo
17e10 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17e20 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
17e30 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
17e40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
17e50 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
17e60 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
17e70 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
17e80 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
17e90 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
17ea0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
17eb0 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
17ec0 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
17ed0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
17ee0 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
17ef0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
17f00 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
17f10 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
17f20 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20  te, 0);.  }.  . 
17f30 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20   if( rc!= 0 ){. 
17f40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17f50 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
17f60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17f70 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72   =  osGetLastErr
17f80 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  or();.    rc = S
17f90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
17fa0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
17fb0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66  -LOCK file=%p, f
17fc0 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c  unc=%s, errno=%l
17fd0 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  u, rc=%s\n",.   
17fe0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17ff0 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70  File.h, (lockTyp
18000 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29  e == _SHM_UNLCK)
18010 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c   ? "winUnlockFil
18020 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e" :.           
18030 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70  "winLockFile", p
18040 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
18050 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18060 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rc)));..  return
18070 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
18080 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
18090 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
180a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
180b0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
180c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
180d0 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
180e0 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
180f0 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
18100 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
18110 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
18120 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
18130 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
18140 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
18150 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
18160 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
18170 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
18180 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
18190 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
181a0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
181b0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
181c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
181d0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
181e0 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
181f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
18200 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
18210 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
18220 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
18230 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20  Node *p;.  BOOL 
18240 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77  bRc;.  assert( w
18250 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
18260 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
18270 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c  SHM-PURGE pid=%l
18280 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64  u, deleteFlag=%d
18290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
182a0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
182b0 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46  essId(), deleteF
182c0 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77  lag));.  pp = &w
182d0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
182e0 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
182f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
18300 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
18310 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
18320 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
18330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
18340 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
18350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18360 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
18370 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
18380 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
18390 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
183a0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
183b0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
183c0 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
183d0 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
183e0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
183f0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
18400 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
18410 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
18420 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
18430 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
18440 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
18450 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
18460 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
18470 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70  HM-PURGE-CLOSE p
18480 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
18490 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
184b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
184c0 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
184d0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
184e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
184f0 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21   if( p->hFile.h!
18500 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c  =NULL && p->hFil
18510 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  e.h!=INVALID_HAN
18520 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
18530 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18540 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18550 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
18560 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18570 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
18580 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18590 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
185a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
185b0 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20  deleteFlag ){.  
185c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
185d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
185e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
185f0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
18600 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44  ();.        winD
18610 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a  elete(pVfs, p->z
18620 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
18630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
18640 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
18650 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
18660 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
18670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18680 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
18690 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
186a0 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a  ee(p->aRegion);.
186b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
186c0 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(p);.    }else
186d0 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d  {.      pp = &p-
186e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
186f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
18700 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
18710 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
18720 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
18730 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a  file pDbFd..**.*
18740 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
18750 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
18760 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
18770 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
18780 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
18790 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
187a0 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
187b0 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
187c0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
187d0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
187e0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
187f0 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
18800 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
18810 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
18820 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61  c int winOpenSha
18830 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c  redMemory(winFil
18840 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
18850 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  uct winShm *p;  
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
18880 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
18890 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
188a0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
188b0 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  = 0;   /* The un
188c0 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
188d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
188e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18900 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
18910 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
18920 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  ode *pNew;      
18930 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
18940 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f  located winShmNo
18950 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  de */.  int nNam
18960 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18980 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
18990 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ytes */..  asser
189a0 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
189b0 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
189c0 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
189d0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
189e0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
189f0 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
18a00 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
18a10 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
18a20 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
18a30 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
18a40 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
18a50 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
18a60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18a70 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
18a80 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
18a90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18aa0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20  _NOMEM;.  nName 
18ab0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18ac0 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
18ad0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
18ae0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
18af0 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
18b00 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20   nName + 17 );. 
18b10 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
18b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18b30 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
18b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
18b50 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  EM;.  }.  pNew->
18b60 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
18b70 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
18b80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
18b90 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
18ba0 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
18bb0 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
18bc0 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
18bd0 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
18be0 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
18bf0 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20  lename); ..  /* 
18c00 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
18c10 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
18c20 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
18c30 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
18c40 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
18c50 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
18c60 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
18c70 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
18c80 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
18c90 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
18ca0 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
18cb0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
18cc0 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
18cd0 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
18ce0 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
18cf0 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
18d00 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
18d10 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
18d20 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
18d30 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
18d40 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
18d50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
18d60 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
18d70 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
18d80 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
18d90 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
18da0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
18db0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
18dc0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
18dd0 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
18de0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
18df0 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
18e00 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
18e10 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
18e20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
18e30 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
18e40 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
18e50 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
18e60 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
18e70 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
18e80 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
18e90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
18ea0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
18eb0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
18ec0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
18ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
18ee0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
18ef0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
18f00 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
18f10 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
18f20 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
18f30 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
18f40 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
18f50 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
18f60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18f70 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
18f80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
18f90 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
18fa0 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
18fb0 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
18fc0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
18ff0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
19000 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19010 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
19030 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
19040 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
19050 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
19060 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
19070 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
19080 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
19090 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
190a0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
190b0 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
190c0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
190d0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
190e0 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  th. .    */.    
190f0 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  if( winShmSystem
19100 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
19110 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
19120 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
19130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19140 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
19150 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19160 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
19170 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
191a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
191b0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
191c0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
191d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
191e0 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
191f0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
19200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19210 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
19230 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
19240 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
19250 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
19260 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
19270 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
19280 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
19290 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
192a0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
192b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
192c0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
192d0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
192e0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
192f0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
19300 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
19310 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
19320 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
19330 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
19340 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
19350 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
19360 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
19370 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
19380 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
19390 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
193a0 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
193b0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
193c0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
193d0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
193e0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
193f0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
19400 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
19410 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
19420 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
19430 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
19440 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
19450 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
19460 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
19470 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
19480 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
19490 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
194a0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
194b0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
194c0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
194d0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
194e0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
194f0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
19500 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
19510 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
19520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
19530 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
19540 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
19550 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
19560 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
19570 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
19580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19590 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
195a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
195b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
195c0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
195d0 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
195e0 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
195f0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
19600 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
19610 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
19620 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
19630 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
19640 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
19650 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
19660 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
19670 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
19680 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
19690 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
196a0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
196b0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
196c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
196d0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
196e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
196f0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
19700 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
19710 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
19720 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
19730 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
19740 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
19750 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
19760 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
19770 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
19780 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
19790 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
197a0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
197b0 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
197c0 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
197d0 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
197e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
197f0 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
19800 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
19810 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
19820 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
19830 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
19840 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19850 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
19860 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
19870 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
19880 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
19890 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
198a0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
198b0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
198c0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
198d0 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
198e0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
198f0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
19900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19910 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
19920 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
19930 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
19940 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
19950 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
19960 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
19970 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
19980 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19990 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
199a0 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
199b0 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
199c0 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
199d0 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
199e0 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
199f0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
19a00 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
19a10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
19a20 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
19a30 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
19a40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19a50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19a60 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
19a70 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
19a80 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
19a90 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
19aa0 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
19ab0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
19ac0 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
19ad0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
19ae0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
19af0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
19b00 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
19b10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
19b20 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
19b30 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
19b40 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
19b50 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
19b60 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
19b70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19b80 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
19b90 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
19ba0 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
19bb0 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
19bc0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
19bd0 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
19be0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
19bf0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
19c00 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
19c10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
19c20 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c40 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
19c50 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
19c60 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
19c90 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
19ca0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
19cb0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
19cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
19cd0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
19ce0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
19cf0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
19d00 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
19d10 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
19d20 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
19d30 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
19d40 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
19d50 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
19d60 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
19d70 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
19d80 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
19d90 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19dc0 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
19dd0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
19de0 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
19df0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
19e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19e30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19e60 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
19e70 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
19e80 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
19e90 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
19ea0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
19eb0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
19ec0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
19ed0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
19ee0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
19ef0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
19f00 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
19f10 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
19f20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
19f30 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
19f40 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
19f50 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
19f60 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
19f70 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
19f80 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
19f90 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
19fa0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
19fb0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
19fc0 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
19fd0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
19fe0 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
19ff0 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1a000 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1a010 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1a020 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1a030 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1a040 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a050 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1a060 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1a070 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1a080 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1a090 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1a0a0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a0b0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1a0c0 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1a0d0 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1a0e0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1a0f0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1a100 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1a110 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1a120 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1a130 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a140 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1a150 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1a160 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1a170 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1a180 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1a190 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1a1a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1a1b0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1a1c0 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1a1d0 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1a1e0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1a1f0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1a200 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1a210 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1a220 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1a230 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1a240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a250 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1a260 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1a270 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1a280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1a2a0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1a2b0 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1a2c0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1a2d0 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
1a2e0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1a2f0 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1a300 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1a310 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1a320 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a330 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1a340 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1a350 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1a360 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1a370 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1a380 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1a390 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1a3a0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1a3b0 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1a3c0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a3d0 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1a3e0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1a3f0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1a400 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1a410 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1a420 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1a430 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1a440 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1a450 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1a460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a470 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1a480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a490 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1a4a0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1a4b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1a4c0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1a4d0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1a4e0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1a4f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a510 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1a520 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1a530 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1a540 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1a550 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1a560 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1a570 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1a580 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1a590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1a5a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1a5b0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1a5c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1a5d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a5f0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1a600 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1a610 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1a620 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1a630 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1a640 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1a650 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1a660 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1a670 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1a680 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1a690 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1a6a0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1a6b0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1a6c0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1a6d0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1a6e0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1a6f0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
1a700 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1a710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1a720 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a740 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
1a750 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
1a760 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
1a770 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
1a780 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
1a790 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
1a7a0 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1a7b0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1a7c0 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
1a7d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a7f0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1a800 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1a810 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
1a820 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1a830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1a840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1a860 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1a870 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1a880 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1a890 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1a8a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1a8b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a8c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1a8d0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1a8e0 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
1a8f0 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
1a900 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
1a910 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1a930 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1a940 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
1a950 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1a960 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
1a970 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
1a980 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
1a990 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1a9a0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1a9b0 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1a9c0 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1a9d0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
1a9e0 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1a9f0 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1aa00 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1aa10 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1aa20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1aa30 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1aa40 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1aa50 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1aa60 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1aa70 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1aa80 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1aa90 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1aaa0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1aab0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1aac0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1aad0 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1aae0 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1aaf0 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1ab00 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1ab10 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1ab20 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1ab30 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1ab40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ab50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ab60 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1ab70 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1ab80 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1ab90 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1aba0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1abb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1abc0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1abd0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1abe0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1abf0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1ac00 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1ac10 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1ac20 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1ac30 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1ac40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1ac50 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1ac60 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1ac70 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1ac80 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1ac90 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1aca0 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1acb0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1acc0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1acd0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1ace0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1acf0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1ad00 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1ad10 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1ad20 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1ad30 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1ad40 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1ad50 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1ad60 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
1ad70 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1ad80 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1ad90 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1ada0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1adb0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1adc0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1add0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1ade0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1adf0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1ae00 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1ae10 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1ae20 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1ae30 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1ae40 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1ae50 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1ae60 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1ae70 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1ae80 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1ae90 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1aea0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1aeb0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1aec0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1aed0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1aee0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1aef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1af00 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1af10 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1af20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1af30 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1af40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1af50 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1af80 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1af90 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1afb0 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1afc0 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1aff0 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1b000 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1b010 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b030 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1b040 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1b050 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1b060 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1b070 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1b080 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1b090 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1b0a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b0b0 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1b0c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1b0d0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1b0e0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1b0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b100 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1b110 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1b120 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1b130 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1b140 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b150 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1b160 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1b170 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1b180 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1b190 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1b1a0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1b1b0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1b1c0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1b1d0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1b1e0 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1b1f0 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1b200 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1b210 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1b220 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1b230 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1b240 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1b250 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1b260 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1b270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1b280 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1b290 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1b2a0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1b2b0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1b2c0 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1b2d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1b2e0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1b2f0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1b300 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1b310 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1b320 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1b330 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1b340 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1b350 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1b360 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1b370 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1b380 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1b390 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1b3a0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1b3b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1b3c0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1b3d0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1b3e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b3f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1b400 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b410 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1b420 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b440 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
1b450 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1b460 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b470 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
1b480 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
1b490 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1b4a0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1b4b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1b4c0 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
1b4d0 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1b4e0 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
1b4f0 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1b500 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1b510 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b520 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1b530 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1b540 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
1b550 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
1b560 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1b570 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1b580 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1b590 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1b5a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b5b0 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
1b5c0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1b5d0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1b5e0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1b5f0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1b600 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
1b610 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b630 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1b640 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b650 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1b660 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1b680 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1b690 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1b6a0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b6b0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1b6c0 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1b6d0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1b6e0 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1b6f0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1b700 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1b710 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1b720 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1b730 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1b740 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1b750 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1b760 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1b770 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1b780 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1b790 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b7a0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b7b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1b7c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1b7d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1b7e0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1b7f0 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1b800 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1b810 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1b820 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1b830 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1b840 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1b850 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1b860 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1b870 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1b880 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1b890 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  .     .#if SQLIT
1b8a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1b8b0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1b8c0 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1b8d0 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  pp(pShmNode->hFi
1b8e0 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1b8f0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1b900 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  RITE, nByte, NUL
1b910 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1b920 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b930 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1b940 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1b950 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b960 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
1b970 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1b980 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1b990 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1b9a0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1b9b0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1b9c0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1b9d0 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1b9e0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1b9f0 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1ba00 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20  File.h, .       
1ba10 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1ba20 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1ba30 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1ba40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1ba50 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1ba60 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
1ba70 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
1ba80 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1baa0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1bab0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1bac0 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1bae0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
1baf0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
1bb00 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
1bb10 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1bb20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1bb30 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1bb40 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1bb50 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1bb60 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1bb70 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1bb80 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
1bb90 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1bba0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1bbb0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1bbc0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1bbd0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1bbe0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1bbf0 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
1bc00 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1bc10 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1bc20 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
1bc30 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
1bc40 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1bc50 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
1bc60 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1bc70 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1bc80 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
1bc90 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
1bca0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
1bcb0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
1bcc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
1bcd0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1bce0 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  AP-MAP pid=%lu, 
1bcf0 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65  region=%d, offse
1bd00 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  t=%d, size=%d, r
1bd10 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1bd20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1bd30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1bd40 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1bd50 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
1bd80 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1bd90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1bda0 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
1bdb0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1bdc0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1bdd0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1bde0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1bdf0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1be00 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
1be10 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1be20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be30 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
1be40 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1be50 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
1be60 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
1be70 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
1be80 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1be90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1bea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1beb0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1bec0 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
1bed0 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1bee0 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1bef0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
1bf00 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
1bf10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1bf20 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
1bf30 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
1bf40 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1bf50 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
1bf60 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1bf70 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
1bf80 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
1bf90 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1bfa0 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1bfb0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1bfc0 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
1bfd0 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
1bfe0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1bff0 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
1c000 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
1c010 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
1c020 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
1c030 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1c040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c050 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1c060 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c070 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
1c080 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
1c090 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1c0a0 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
1c0b0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
1c0c0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
1c0d0 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
1c0e0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1c0f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1c100 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  AL */../*.** Cle
1c110 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65  ans up the mappe
1c120 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20  d region of the 
1c130 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
1c140 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53  if any..*/.#if S
1c150 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1c160 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
1c170 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
1c180 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
1c190 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
1c1a0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1c1b0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c1c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68  %lu, pFile=%p, h
1c1d0 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  Map=%p, pMapRegi
1c1e0 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1c1f0 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c      "mmapSize=%l
1c200 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  ld, mmapSizeActu
1c210 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  al=%lld, mmapSiz
1c220 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  eMax=%lld\n",.  
1c230 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c240 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c250 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1c260 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  hMap, pFile->pMa
1c270 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  pRegion,.       
1c280 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1c290 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ize, pFile->mmap
1c2a0 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c  SizeActual, pFil
1c2b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29  e->mmapSizeMax))
1c2c0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ;.  if( pFile->p
1c2d0 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
1c2e0 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65   if( !osUnmapVie
1c2f0 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
1c300 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20  MapRegion) ){.  
1c310 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c320 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1c330 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1c340 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c350 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c360 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
1c370 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
1c380 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
1c390 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
1c3a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c3b0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c3d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c3e0 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
1c3f0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1c400 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1c410 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1c420 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1c430 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1c440 55 6e 6d 61 70 31 22 2c 20 70 46 69 6c 65 2d 3e  Unmap1", pFile->
1c450 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
1c460 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1c470 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
1c480 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
1c490 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1c4a0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
1c4b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
1c4c0 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
1c4d0 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
1c4e0 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
1c4f0 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
1c500 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1c510 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1c520 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1c530 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1c540 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1c550 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
1c560 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1c570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c580 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c590 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c5a0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
1c5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
1c5c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c5d0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
1c5e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
1c610 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
1c620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1c630 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
1c640 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1c650 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c660 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1c670 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1c680 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1c690 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1c6a0 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72  (), pFile));.  r
1c6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
1c6d0 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
1c6e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
1c6f0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1c700 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
1c710 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
1c720 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
1c730 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
1c740 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
1c750 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
1c760 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
1c770 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
1c780 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
1c790 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
1c7a0 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
1c7b0 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1c7c0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1c7d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c7e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1c7f0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1c800 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1c810 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1c820 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1c830 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
1c840 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
1c850 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
1c860 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
1c870 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
1c880 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
1c890 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1c8a0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1c8b0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
1c8c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
1c8d0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
1c8e0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
1c8f0 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
1c900 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
1c910 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
1c920 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1c930 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  E, whichever is 
1c940 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
1c950 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c960 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
1c970 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
1c980 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
1c990 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
1c9a0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1c9b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1c9c0 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
1c9d0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
1c9e0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
1c9f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1ca00 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1ca10 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  pFd, sqlite3_int
1ca20 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c  64 nByte){.  sql
1ca30 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20  ite3_int64 nMap 
1ca40 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
1ca50 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
1ca60 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
1ca70 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
1ca80 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1ca90 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1caa0 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c  e=%p, size=%lld\
1cab0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1cac0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1cad0 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79  ssId(), pFd, nBy
1cae0 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64  te));..  if( pFd
1caf0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
1cb00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cb10 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
1cb20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  ){.    rc = winF
1cb30 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1cb40 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61  _file*)pFd, &nMa
1cb50 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
1cb60 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1cb70 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1cb80 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1cb90 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
1cba0 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  TAT\n",.        
1cbb0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1cbc0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1cbd0 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74  pFd));.      ret
1cbe0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1cbf0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
1cc00 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
1cc10 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
1cc20 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
1cc30 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1cc40 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71  }.  nMap &= ~(sq
1cc50 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e  lite3_int64)(win
1cc60 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1cc70 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28  ze - 1);. .  if(
1cc80 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
1cc90 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1cca0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1ccb0 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
1ccc0 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
1ccd0 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
1cce0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
1ccf0 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
1cd00 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
1cd10 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
1cd20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
1cd30 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1cd40 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
1cd50 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
1cd60 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
1cd70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1cd80 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1cd90 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
1cda0 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
1cdb0 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
1cdc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1cdd0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1cde0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1cdf0 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
1ce00 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1ce10 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
1ce20 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1ce30 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1ce40 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
1ce50 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1ce60 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
1ce70 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1ceb0 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1cec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1cef0 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1cf00 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1cf10 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1cf20 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
1cf30 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1cf40 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1cf50 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1cf60 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1cf90 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1cfa0 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1cfd0 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1cfe0 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
1cff0 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
1d000 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
1d010 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1d020 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1d030 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1d040 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d050 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1d060 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1d090 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  le", pFd->zPath)
1d0a0 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1d0b0 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1d0c0 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1d0d0 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1d0e0 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1d0f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1d100 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1d110 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d120 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1d130 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
1d140 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d150 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d160 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
1d170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d180 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d190 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79  t( (nMap % winSy
1d1a0 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1d1b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
1d1c0 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1d1d0 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1d1e0 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
1d1f0 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
1d200 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d210 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
1d220 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1d230 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70  romApp(pFd->hMap
1d240 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a  , flags, 0, (SIZ
1d250 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65  E_T)nMap);.#else
1d260 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1d270 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
1d280 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1d290 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1d2a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1d2b0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
1d2c0 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
1d2d0 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
1d2e0 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
1d2f0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
1d300 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1d310 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1d320 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
1d330 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d340 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
1d350 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1d360 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1d370 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  ile", pFd->zPath
1d380 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1d390 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
1d3a0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d3b0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1d3c0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1d3d0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d3e0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d3f0 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20  (), pFd));.     
1d400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d410 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
1d420 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
1d430 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
1d440 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
1d450 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1d460 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
1d470 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1d480 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1d490 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1d4a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1d4b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d4c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d4d0 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
1d4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1d4f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
1d500 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
1d510 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
1d520 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
1d530 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
1d540 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
1d550 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
1d560 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
1d570 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
1d580 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
1d590 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
1d5a0 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
1d5b0 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
1d5c0 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
1d5d0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
1d5e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1d5f0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
1d600 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
1d610 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
1d620 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
1d630 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
1d640 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1d650 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
1d660 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1d670 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
1d680 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
1d690 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
1d6a0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1d6b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
1d6c0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
1d6d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
1d6e0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
1d6f0 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
1d700 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
1d710 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
1d720 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
1d730 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
1d740 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1d750 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
1d760 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
1d770 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
1d780 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1d790 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1d7a0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1d7b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1d7c0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1d7d0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
1d7e0 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1d7f0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
1d800 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1d810 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
1d820 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
1d830 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d840 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d850 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
1d860 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
1d870 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1d880 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
1d890 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
1d8a0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
1d8b0 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
1d8c0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1d8d0 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
1d8e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d900 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1d910 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1d920 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1d930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d940 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d950 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1d960 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1d970 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1d980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d990 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1d9a0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
1d9b0 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
1d9c0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
1d9d0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1d9e0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
1d9f0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
1da00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1da10 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1da20 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1da30 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
1da40 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
1da50 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1da60 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1da70 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1da80 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
1da90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1daa0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1dab0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1dac0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
1dad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1dae0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
1daf0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
1db00 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1db10 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
1db20 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
1db30 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1db40 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1db50 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
1db60 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
1db70 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
1db80 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
1db90 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
1dba0 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
1dbb0 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
1dbc0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1dbd0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1dbe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1dbf0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
1dc00 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
1dc10 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
1dc20 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
1dc30 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
1dc40 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
1dc50 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
1dc60 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
1dc70 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
1dc80 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
1dc90 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1dca0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
1dcb0 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
1dcc0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1dcd0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1dce0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1dcf0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1dd00 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1dd10 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
1dd20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
1dd30 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
1dd40 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1dd50 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1dd60 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
1dd70 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
1dd80 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
1dd90 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
1dda0 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
1ddb0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1ddc0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
1ddd0 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
1dde0 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
1ddf0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
1de00 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
1de10 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
1de20 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
1de30 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
1de40 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
1de50 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1de60 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
1de70 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
1de80 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1de90 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1dea0 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
1deb0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1dec0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ded0 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
1dee0 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
1def0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
1df00 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
1df10 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
1df20 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
1df30 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
1df40 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
1df50 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
1df60 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
1df70 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
1df80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
1df90 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
1dfa0 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
1dfb0 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62  essary can can b
1dfc0 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
1dfd0 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
1dfe0 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
1dff0 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
1e000 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1e010 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e020 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
1e030 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
1e040 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1e050 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e060 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1e070 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e080 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e090 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
1e0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e0b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
1e0c0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1e0d0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1e0e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1e0f0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1e100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1e110 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1e120 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1e130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e140 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1e150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e190 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1e1a0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
1e1b0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
1e1c0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
1e1d0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
1e1e0 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
1e1f0 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
1e200 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1e210 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
1e220 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1e250 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
1e260 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1e270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e280 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
1e290 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
1e2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1e2b0 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
1e2c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1e2e0 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
1e2f0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1e300 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1e310 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
1e320 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
1e340 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
1e350 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1e360 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1e370 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
1e380 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1e390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1e3a0 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
1e3b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1e3c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1e3d0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
1e3e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
1e3f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
1e400 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
1e410 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
1e420 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e430 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
1e440 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
1e450 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1e460 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
1e470 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
1e480 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1e490 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
1e4a0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1e4b0 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
1e4c0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
1e4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e4e0 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
1e4f0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1e500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e510 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
1e520 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
1e530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e540 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
1e550 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
1e580 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
1e5b0 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
1e5e0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
1e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e630 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1e640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
1e650 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
1e660 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1e670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1e680 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
1e690 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1e6a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1e6b0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
1e6c0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
1e6d0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
1e6e0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
1e6f0 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
1e700 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
1e710 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1e720 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1e730 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
1e740 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
1e750 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
1e760 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
1e770 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
1e780 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1e790 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
1e7a0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1e7b0 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76  ic void *winConv
1e7c0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e7d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e7e0 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
1e7f0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
1e800 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
1e810 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
1e820 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
1e830 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1e840 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1e850 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e860 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1e870 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1e880 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1e890 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1e8a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1e8b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1e8c0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1e8d0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1e8e0 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1e8f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e900 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
1e910 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
1e920 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  ed UTF-8 string 
1e930 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77  buffer.** ends w
1e940 69 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20  ith a directory 
1e950 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1e960 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
1e970 6e 74 20 77 69 6e 45 6e 64 73 49 6e 44 69 72 53  nt winEndsInDirS
1e980 65 70 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  ep(char *zBuf){.
1e990 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20    if( zBuf ){.  
1e9a0 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c    int nLen = sql
1e9b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
1e9c0 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e  f);.    return n
1e9d0 4c 65 6e 3e 30 20 26 26 20 77 69 6e 49 73 44 69  Len>0 && winIsDi
1e9e0 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
1e9f0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
1ea00 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
1ea10 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
1ea20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74  file name and st
1ea30 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ore the resultin
1ea40 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70  g pointer into p
1ea50 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69  zBuf..** The poi
1ea60 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  nter returned in
1ea70 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66   pzBuf must be f
1ea80 72 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  reed via sqlite3
1ea90 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
1eaa0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
1eab0 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
1eac0 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a  s *pVfs, char **
1ead0 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  pzBuf){.  static
1eae0 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
1eaf0 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
1eb00 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
1eb10 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
1eb20 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
1eb30 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
1eb40 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
1eb50 20 6a 3b 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20   j;.  int nBuf, 
1eb60 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nLen;.  char *zB
1eb70 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  uf;..  /* It's o
1eb80 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
1eb90 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
1eba0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
1ebb0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
1ebc0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
1ebd0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
1ebe0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
1ebf0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
1ec00 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
1ec10 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
1ec20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1ec30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ec40 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  OERR );..  /* Al
1ec50 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61  locate a tempora
1ec60 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  ry buffer to sto
1ec70 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  re the fully qua
1ec80 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a  lified file.  **
1ec90 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65   name for the te
1eca0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49  mporary file.  I
1ecb0 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65  f this fails, we
1ecc0 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65   cannot continue
1ecd0 2e 0a 20 20 2a 2f 0a 20 20 6e 42 75 66 20 3d 20  ..  */.  nBuf = 
1ece0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ecf0 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74  ;.  zBuf = sqlit
1ed00 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
1ed10 75 66 2b 32 20 29 3b 0a 20 20 69 66 28 20 21 7a  uf+2 );.  if( !z
1ed20 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  Buf ){.    OSTRA
1ed30 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
1ed40 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
1ed50 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
1ed60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ed70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1ed80 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1ed90 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
1eda0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
1edb0 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68  tory.  First, ch
1edc0 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  eck if one.  ** 
1edd0 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69  has been explici
1ede0 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61  tly set by the a
1edf0 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65  pplication; othe
1ee00 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f  rwise, use the o
1ee10 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  ne.  ** configur
1ee20 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74  ed by the operat
1ee30 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ing system..  */
1ee40 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e  .  assert( nBuf>
1ee50 33 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  30 );.  if( sqli
1ee60 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1ee70 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
1ee80 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
1ee90 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 25 73 22  30, zBuf, "%s%s"
1eea0 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
1eeb0 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 20 20  irectory,.      
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1eed0 69 6e 45 6e 64 73 49 6e 44 69 72 53 65 70 28 73  inEndsInDirSep(s
1eee0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1eef0 63 74 6f 72 79 29 20 3f 20 22 22 20 3a 0a 20 20  ctory) ? "" :.  
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 77 69 6e 47 65 74 44 69 72 44 65 70 28     winGetDirDep(
1ef20 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c  ));.  }.#if !SQL
1ef30 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65  ITE_OS_WINRT.  e
1ef40 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29  lse if( osIsNT()
1ef50 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
1ef60 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52  ulti;.    LPWSTR
1ef70 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c   zWidePath = sql
1ef80 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1ef90 6e 42 75 66 2a 73 69 7a 65 6f 66 28 57 43 48 41  nBuf*sizeof(WCHA
1efa0 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  R) );.    if( !z
1efb0 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20  WidePath ){.    
1efc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1efd0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
1efe0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
1eff0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
1f000 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
1f010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f020 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1f030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1f040 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 42  sGetTempPathW(nB
1f050 75 66 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d  uf, zWidePath)==
1f060 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1f070 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
1f080 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
1f090 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
1f0a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
1f0b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
1f0c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
1f0d0 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
1f0e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f0f0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
1f100 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ATH;.    }.    z
1f110 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
1f120 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
1f130 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
1f140 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
1f150 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1f160 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73  uf-30, zBuf, "%s
1f170 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
1f180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f190 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
1f1a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
1f1b0 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Path);.    }else
1f1c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1f1d0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
1f1e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f1f0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
1f200 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
1f210 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
1f220 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
1f230 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
1f240 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1f250 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1f260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1f270 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1f280 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
1f290 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a  Utf8;.    char *
1f2a0 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69  zMbcsPath = sqli
1f2b0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
1f2c0 42 75 66 20 29 3b 0a 20 20 20 20 69 66 28 20 21  Buf );.    if( !
1f2d0 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20  zMbcsPath ){.   
1f2e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f2f0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
1f300 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1f310 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
1f320 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
1f330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f340 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1f350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f360 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e  osGetTempPathA(n
1f370 42 75 66 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d  Buf, zMbcsPath)=
1f380 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1f390 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
1f3a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f3b0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
1f3c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
1f3d0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
1f3e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f3f0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
1f400 50 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  PPATH;.    }.   
1f410 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
1f420 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1f430 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
1f440 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
1f450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1f460 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c  nprintf(nBuf-30,
1f470 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74   zBuf, "%s", zUt
1f480 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
1f490 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
1f4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f4b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
1f4c0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
1f4d0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
1f4e0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
1f4f0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
1f500 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f510 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1f520 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1f530 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
1f540 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e  _HAS_ANSI */.#en
1f550 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1f560 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a  S_WINRT */..  /*
1f570 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1f580 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
1f590 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
1f5a0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
1f5b0 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
1f5c0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
1f5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f5e0 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20  OR..  */.  nLen 
1f5f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f600 30 28 7a 42 75 66 29 3b 0a 0a 20 20 69 66 28 20  0(zBuf);..  if( 
1f610 28 6e 4c 65 6e 20 2b 20 73 71 6c 69 74 65 33 53  (nLen + sqlite3S
1f620 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
1f630 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
1f640 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29   + 18) >= nBuf )
1f650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1f660 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53  ee(zBuf);.    OS
1f670 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
1f680 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
1f690 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
1f6a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1f6b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ROR;.  }..  sqli
1f6c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
1f6d0 66 2d 31 38 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b  f-18-nLen, zBuf+
1f6e0 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d  nLen, SQLITE_TEM
1f6f0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
1f700 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
1f710 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
1f720 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1f730 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
1f740 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
1f750 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
1f760 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
1f770 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
1f780 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
1f790 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
1f7a0 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
1f7b0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42  Buf[j] = 0;.  zB
1f7c0 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a  uf[j+1] = 0;.  *
1f7d0 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20  pzBuf = zBuf;.. 
1f7e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
1f7f0 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73  FILENAME name=%s
1f800 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1f810 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74  ", zBuf));.  ret
1f820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f830 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1f840 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
1f850 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20   file is really 
1f860 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65  a directory.  Re
1f870 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a  turn false if.**
1f880 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67   it is something
1f890 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69   other than a di
1f8a0 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74  rectory, or if t
1f8b0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
1f8c0 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c   of memory.** al
1f8d0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
1f8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f8f0 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
1f900 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29  oid *zConverted)
1f910 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
1f920 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1f930 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f940 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
1f950 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
1f960 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
1f970 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
1f980 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
1f990 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
1f9a0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
1f9b0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
1f9c0 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
1f9d0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1f9e0 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
1f9f0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
1fa20 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
1fa50 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
1fa60 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1fa70 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
1fa80 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
1fa90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1faa0 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a   Invalid name? *
1fab0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72  /.    }.    attr
1fac0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1fad0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23  ileAttributes;.#
1fae0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1faf0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
1fb00 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1fb10 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
1fb20 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1fb30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
1fb40 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e  return (attr!=IN
1fb50 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1fb60 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26  BUTES) && (attr&
1fb70 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1fb80 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a  IRECTORY);.}../*
1fb90 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
1fba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1fbb0 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
1fbc0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1fbd0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67      /* Used to g
1fbe0 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20  et maximum path 
1fbf0 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20  name length */. 
1fc00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1fc10 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
1fc20 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
1fc30 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
1fc40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
1fc50 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1fc60 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
1fc70 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
1fc80 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1fc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1fca0 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
1fcb0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fcd0 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
1fce0 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
1fcf0 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  E h;.  DWORD las
1fd00 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20  tErrno;.  DWORD 
1fd10 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
1fd20 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
1fd30 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
1fd40 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1fd50 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
1fd60 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1fd70 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
1fd80 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
1fd90 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
1fda0 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
1fdb0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
1fdc0 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
1fdd0 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
1fde0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
1fdf0 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
1fe00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1fe10 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
1fe20 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
1fe30 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
1fe40 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
1fe50 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
1fe60 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
1fe70 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
1fe80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1fe90 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
1fea0 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
1feb0 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
1fec0 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
1fed0 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
1fee0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
1fef0 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f  *zTmpname = 0; /
1ff00 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
1ff10 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63  filename, if nec
1ff20 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e  essary. */..  in
1ff30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ff40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ff50 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
1ff60 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66  Code */.#if !def
1ff70 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1ff80 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1ff90 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
1ffa0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
1ffb0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
1ffc0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
1ffd0 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  if..  int isExcl
1ffe0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
1fff0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
20000 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
20010 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
20020 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20030 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20040 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
20050 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20060 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
20070 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
20080 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
20090 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
200a0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
200b0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
200c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
200d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
200e0 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
200f0 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
20100 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
20110 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
20120 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
20130 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
20140 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
20150 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
20160 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
20170 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
20180 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
20190 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
201a0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
201b0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67  , pFile=%p, flag
201c0 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  s=%x, pOutFlags=
201d0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
201e0 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c    zUtf8Name, id,
201f0 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
20200 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s));..  /* Check
20210 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
20220 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
20230 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
20240 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
20250 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
20260 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
20270 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
20280 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
20290 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
202a0 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
202b0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
202c0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
202d0 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
202e0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
202f0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
20300 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
20310 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
20320 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
20330 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
20340 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
20350 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
20360 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
20370 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
20380 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
20390 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
203a0 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
203b0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
203c0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
203d0 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
203e0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
203f0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
20400 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
20410 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
20420 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
20430 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
20440 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
20450 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
20460 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
20470 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
20480 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
20490 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
204a0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
204b0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
204c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
204d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
204e0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
204f0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
20500 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
20510 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
20520 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
20530 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
20540 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
20550 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
20560 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20570 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20580 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20590 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
205a0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
205b0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
205c0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
205d0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
205e0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
205f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
20600 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
20610 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
20620 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
20630 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
20640 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
20650 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
20660 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
20670 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
20680 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
20690 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
206a0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
206b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
206c0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
206d0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
206e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
206f0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
20700 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
20710 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
20720 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
20730 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
20740 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
20750 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
20760 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
20770 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
20780 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
20790 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21   !zUtf8Name && !
207a0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
207b0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
207c0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
207d0 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20  _ERROR,.        
207e0 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  "sqlite3_temp_di
207f0 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65  rectory variable
20800 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66   should be set f
20810 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a  or WinRT");.  }.
20820 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
20830 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20840 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
20850 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
20860 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74  nerate a .  ** t
20870 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
20880 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a  me to use .  */.
20890 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
208a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
208b0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
208c0 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  penJournal );.  
208d0 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d    rc = winGetTem
208e0 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d  pname(pVfs, &zTm
208f0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
20900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20910 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
20920 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
20930 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65  c=%s", zUtf8Name
20940 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20950 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
20960 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20970 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
20980 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
20990 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
209a0 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
209b0 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
209c0 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
209d0 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20  .  ** URIs with 
209e0 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
209f0 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
20a00 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
20a10 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
20a20 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
20a30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20a40 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f  (eType!=SQLITE_O
20a50 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20  PEN_MAIN_DB) || 
20a60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20a70 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20  OPEN_URI) ||.   
20a80 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71      zUtf8Name[sq
20a90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
20aa0 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  tf8Name)+1]==0 )
20ab0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
20ac0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
20ad0 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
20ae0 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
20af0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
20b00 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  tUtf8Filename(zU
20b10 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
20b20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
20b30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
20b40 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
20b50 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
20b60 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
20b70 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c  TE_IOERR_NOMEM",
20b80 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
20b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20ba0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
20bb0 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72  ..  if( winIsDir
20bc0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
20bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20be0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
20bf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20c00 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
20c10 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
20c20 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
20c30 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c  CANTOPEN_ISDIR",
20c40 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
20c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20c60 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a  CANTOPEN_ISDIR;.
20c70 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
20c80 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
20c90 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
20ca0 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
20cb0 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
20cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
20cd0 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
20ce0 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
20cf0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
20d00 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
20d10 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
20d20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
20d30 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  is .  ** created
20d40 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
20d50 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
20d60 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
20d70 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20  ccess" .  ** as 
20d80 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
20d90 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
20da0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
20db0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
20dc0 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
20dd0 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
20de0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
20df0 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
20e00 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
20e10 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
20e20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
20e30 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
20e40 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
20e50 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
20e60 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
20e70 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
20e80 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
20e90 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
20ea0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
20eb0 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
20ec0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20ed0 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
20ee0 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
20ef0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
20f00 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
20f10 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
20f20 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
20f30 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
20f40 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
20f50 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
20f60 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
20f70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
20f80 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
20f90 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
20fa0 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
20fb0 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
20fc0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
20fd0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
20fe0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
20ff0 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
21020 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
21030 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
21060 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
21070 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
21080 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
21090 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
210a0 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
210b0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
210c0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
210d0 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
210e0 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
210f0 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
21100 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
21110 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
21120 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
21130 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
21140 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
21150 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
21160 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
21170 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
21180 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  dif..  if( osIsN
21190 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
211a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
211b0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
211c0 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
211d0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
211e0 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
211f0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
21200 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
21210 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
21220 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
21230 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
21240 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
21250 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
21260 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
21270 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
21280 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
21290 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
212a0 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
212b0 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
212c0 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
212d0 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
212e0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
212f0 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
21300 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
21310 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
21320 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
21330 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
21340 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
21350 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
21360 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
21370 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77  le = NULL;.    w
21380 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
21390 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54  ateFile2((LPCWST
213a0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
213d0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
21400 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  reMode,.        
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
21430 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65             &exte
21460 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29  ndedParameters))
21470 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
21480 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
214b0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
214c0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
214d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
214e0 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65  p */.    }.#else
214f0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
21500 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
21510 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
21520 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
21550 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
21580 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
215b0 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215d0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
215e0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
21610 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
21620 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
21650 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
21660 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
21670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
21680 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  op */.    }.#end
21690 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
216a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
216b0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
216c0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
216d0 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54  eateFileA((LPCST
216e0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
21710 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
21740 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
21770 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
21780 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
217b0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
217e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
217f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
21820 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
21830 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
21840 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
21850 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
21860 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63  .  winLogIoerr(c
21870 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  nt);..  OSTRACE(
21880 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
21890 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
218a0 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68  %lx, rc=%s\n", h
218b0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20  , zUtf8Name,.   
218c0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
218d0 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56  dAccess, (h==INV
218e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
218f0 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
21900 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68  "ok"));..  if( h
21910 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
21920 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46  _VALUE ){.    pF
21930 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
21940 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
21950 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21960 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
21970 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
21980 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
21990 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
219a0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
219b0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
219c0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
219d0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
219e0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
219f0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
21a00 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
21a10 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20  , zName, id, .  
21a20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
21a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
21a40 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20  NLY) &.         
21a50 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51              ~(SQ
21a60 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
21a70 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
21a80 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20  DWRITE)),.      
21a90 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20     pOutFlags);. 
21aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
21ac0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
21ad0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
21ae0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
21af0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
21b00 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
21b10 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
21b20 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
21b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
21b40 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
21b50 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
21b60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54      }.  }..  OST
21b70 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
21b80 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
21b90 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c  cess=%lx, pOutFl
21ba0 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61  ags=%p, *pOutFla
21bb0 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  gs=%d, ".       
21bc0 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68      "rc=%s\n", h
21bd0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44  , zUtf8Name, dwD
21be0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f  esiredAccess, pO
21bf0 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  utFlags, pOutFla
21c00 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  gs ?.           
21c10 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20  *pOutFlags : 0, 
21c20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  (h==INVALID_HAND
21c30 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69  LE_VALUE) ? "fai
21c40 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
21c50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
21c60 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
21c70 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
21c80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21c90 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72  _DB.       && (r
21ca0 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c  c = winceCreateL
21cb0 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
21cc0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))!=SQLITE_OK.  
21cd0 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
21ce0 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c  ndle(h);.    sql
21cf0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21d00 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
21d10 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
21d20 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
21d30 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61  "OPEN-CE-LOCK na
21d40 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
21d50 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45   zName, sqlite3E
21d60 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
21d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21d80 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
21d90 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
21da0 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
21db0 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
21dc0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
21dd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21de0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
21df0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
21e00 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69  ame);.  }..  pFi
21e10 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
21e20 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
21e30 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
21e40 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
21e50 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
21e60 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ly ){.    pFile-
21e70 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
21e80 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  NFILE_RDONLY;.  
21e90 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
21ea0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
21eb0 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
21ec0 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
21ed0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
21ee0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
21ef0 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
21f00 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73    }.  pFile->las
21f10 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
21f20 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  R;.  pFile->zPat
21f30 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53  h = zName;.#if S
21f40 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
21f50 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68  IZE>0.  pFile->h
21f60 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46  Map = NULL;.  pF
21f70 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
21f80 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
21f90 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46  apSize = 0;.  pF
21fa0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
21fb0 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ual = 0;.  pFile
21fc0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
21fd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21fe0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
21ff0 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  if..  OpenCounte
22000 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
22010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
22020 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
22030 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
22040 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
22050 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
22060 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
22070 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
22080 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
22090 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
220a0 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
220b0 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
220c0 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
220d0 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
220e0 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
220f0 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
22100 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
22110 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
22120 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
22130 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
22140 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
22150 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
22160 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
22170 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
22180 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
22190 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
221a0 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
221b0 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
221c0 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
221d0 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
221e0 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
221f0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
22200 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
22210 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
22220 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
22230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
22240 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
22250 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
22260 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
22270 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
22280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
22290 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
222a0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
222b0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
222c0 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
222d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
222e0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
222f0 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
22300 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
22310 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
22320 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
22330 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22340 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
22350 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
22360 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
22370 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
22380 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
22390 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
223a0 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41  DELETE);.  OSTRA
223b0 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
223c0 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c  =%s, syncDir=%d\
223d0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  n", zFilename, s
223e0 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f  yncDir));..  zCo
223f0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
22400 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
22410 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
22420 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
22430 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
22440 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
22450 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
22460 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
22470 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
22480 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22490 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
224a0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
224b0 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
224c0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
224d0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
224e0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
224f0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
22500 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
22510 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
22520 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
22530 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
22540 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
22550 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
22560 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
22590 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
225a0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
225b0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
225c0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
225d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
225e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
225f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
22600 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
22610 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
22620 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
22630 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
22640 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
22650 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
22660 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22670 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
22680 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
22690 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
226a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
226b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
226c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
226d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
226e0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
226f0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
22700 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
22710 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
22720 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
22730 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
22740 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
22750 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
22760 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
22770 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
22780 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
22790 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
227a0 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
227b0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
227c0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
227d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
227e0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
227f0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
22800 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
22810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22820 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
22830 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
22840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22850 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
22860 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
22870 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
22880 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22890 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
228a0 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
228b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
228c0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
228d0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
228e0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
228f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22900 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
22910 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
22920 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
22930 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
22940 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
22950 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
22960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22970 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
22980 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
22990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
229a0 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
229b0 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
229c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
229d0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
229e0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
229f0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
22a00 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
22a10 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
22a20 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
22a30 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
22a40 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
22a50 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
22a60 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
22a70 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
22a80 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
22a90 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
22aa0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
22ab0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
22ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22ad0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
22ae0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
22af0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
22b00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22b10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22b20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
22b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
22b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22b50 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
22b60 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
22b70 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
22b80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
22b90 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
22ba0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
22bb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22bc0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
22bd0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
22be0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
22bf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
22c00 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
22c10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
22c30 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
22c40 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
22c50 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
22c60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
22c70 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
22c80 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
22c90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
22ca0 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
22cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
22cc0 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
22cd0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
22ce0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
22cf0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
22d00 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
22d10 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
22d20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c           "winDel
22d30 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
22d40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
22d50 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
22d60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
22d70 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22d80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
22d90 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
22da0 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
22db0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
22dc0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
22dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
22de0 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
22df0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
22e00 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
22e10 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
22e20 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
22e30 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
22e40 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
22e50 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
22e60 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
22e70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
22e80 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
22e90 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22eb0 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
22ec0 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
22ed0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
22ee0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
22ef0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
22f00 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
22f10 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
22f20 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
22f30 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
22f40 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
22f50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
22f60 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
22f70 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
22f80 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
22f90 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  S; );.  OSTRACE(
22fa0 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
22fb0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73  , flags=%x, pRes
22fc0 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  Out=%p\n",.     
22fd0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
22fe0 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29   flags, pResOut)
22ff0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
23000 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 55 74 66   = winConvertUtf
23010 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
23020 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
23030 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
23040 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
23050 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  S name=%s, rc=SQ
23060 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23070 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
23080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23090 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
230a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
230b0 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
230c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
230d0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
230e0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
230f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
23100 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
23110 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
23120 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
23130 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
23140 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
23150 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
23180 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
23190 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
231b0 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
231c0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
231d0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
231e0 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
231f0 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
23200 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
23210 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
23220 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
23230 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
23240 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
23250 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
23260 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
23270 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
23280 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
23290 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
232a0 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
232b0 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
232c0 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
232d0 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
232e0 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
232f0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
23300 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
23310 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
23320 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
23330 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
23340 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
23350 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72        winLogIoer
23360 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
23370 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
23380 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
23390 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  D && lastErrno!=
233a0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
233b0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
233c0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
233d0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
233e0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
233f0 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61  Access", zFilena
23400 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
23410 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
23420 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72  rted);.        r
23430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
23440 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
23450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23460 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
23470 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
23480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23490 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
234a0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
234b0 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20   else{.    attr 
234c0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
234d0 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
234e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
234f0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
23500 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
23510 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
23520 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
23530 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
23540 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
23550 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
23560 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
23570 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
23580 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
23590 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
235a0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
235b0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
235c0 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
235d0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
235e0 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ES &&.          
235f0 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f     (attr & FILE_
23600 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
23610 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
23620 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
23630 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
23640 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
23650 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
23660 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
23670 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
23680 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73  SS name=%s, pRes
23690 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
236a0 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
236b0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
236c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73   zFilename, pRes
236d0 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
236e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
236f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
23700 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
23710 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
23720 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
23730 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74  d be used verbat
23740 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a  im.  If.** non-z
23750 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
23760 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
23770 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  on, the calling 
23780 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69  function must si
23790 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20  mply.** use the 
237a0 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61  provided path na
237b0 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d  me verbatim -OR-
237c0 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f   resolve it into
237d0 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d   a full path nam
237e0 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47  e.** using the G
237f0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57  etFullPathName W
23800 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f  in32 API functio
23810 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  n (if available)
23820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
23830 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61   winIsVerbatimPa
23840 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  thname(.  const 
23850 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
23860 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  ){.  /*.  ** If 
23870 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
23880 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77  arts with a forw
23890 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62  ard slash or a b
238a0 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20  ackslash, it is 
238b0 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65  either.  ** a le
238c0 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20  gal UNC name, a 
238d0 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20  volume relative 
238e0 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f  path, or an abso
238f0 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69  lute path name i
23900 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78  n the.  ** "Unix
23910 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64  " format on Wind
23920 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ows.  There is n
23930 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69  o easy way to di
23940 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
23950 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  een.  ** the fin
23960 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68  al two cases; th
23970 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75  erefore, we retu
23980 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74  rn the safer ret
23990 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55  urn value of TRU
239a0 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63  E.  ** so that c
239b0 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
239c0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d  unction will sim
239d0 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61  ply use it verba
239e0 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  tim..  */.  if (
239f0 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61   winIsDirSep(zPa
23a00 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  thname[0]) ){.  
23a10 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
23a20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
23a30 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
23a40 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74  tarts with a let
23a50 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20  ter and a colon 
23a60 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76  it is either a v
23a70 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74  olume.  ** relat
23a80 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61  ive path or an a
23a90 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43  bsolute path.  C
23aa0 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
23ab0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  unction must not
23ac0 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  .  ** attempt to
23ad0 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72   treat it as a r
23ae0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
23af0 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f  e (i.e. they sho
23b00 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20  uld simply use. 
23b10 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29   ** it verbatim)
23b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ..  */.  if ( sq
23b30 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
23b40 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
23b50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
23b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
23b70 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
23b80 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
23b90 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
23ba0 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
23bb0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
23bc0 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
23bd0 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
23be0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
23bf0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
23c00 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
23c10 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
23c20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
23c30 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
23c40 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
23c50 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
23c60 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
23c70 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
23c80 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
23c90 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
23ca0 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
23cb0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
23cc0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
23cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23ce0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
23cf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
23d00 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
23d10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
23d20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
23d30 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
23d40 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
23d50 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
23d60 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
23d70 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d90 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
23da0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
23db0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
23de0 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
23df0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
23e00 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
23e10 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
23e20 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
23e30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
23e40 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
23e50 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
23e60 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
23e70 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
23e80 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
23e90 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
23ea0 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
23eb0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
23ec0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
23ed0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
23ee0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
23ef0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
23f00 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
23f10 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
23f20 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
23f30 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
23f40 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
23f50 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
23f60 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
23f70 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
23f80 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
23f90 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
23fa0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
23fb0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
23fc0 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
23fd0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
23fe0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
23ff0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
24000 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
24010 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  Out ){.      win
24020 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24030 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 30 2c 20  IOERR_NOMEM, 0, 
24040 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
24050 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
24060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24070 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
24090 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43  gwin_conv_path(C
240a0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
240b0 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20  A|CCP_RELATIVE, 
240c0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
240d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
240e0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2d 3e            pVfs->
240f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
24100 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  ){.      winLogE
24110 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
24120 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 28  OPEN_FULLPATH, (
24130 44 57 4f 52 44 29 65 72 72 6e 6f 2c 20 22 63 79  DWORD)errno, "cy
24140 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 22 2c  gwin_conv_path",
24150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24160 20 20 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20     zRelative);. 
24170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24180 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
24190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
241a0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a  TOPEN_FULLPATH;.
241b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
241c0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
241d0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
241e0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
241f0 22 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20  "%s%s%s",.      
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24210 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
24220 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
24230 44 65 70 28 29 2c 20 7a 4f 75 74 29 3b 0a 20 20  Dep(), zOut);.  
24240 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24250 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
24260 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
24270 6e 76 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49  nv_path(CCP_POSI
24280 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c  X_TO_WIN_A, zRel
24290 61 74 69 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46  ative, zFull, nF
242a0 75 6c 6c 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ull)<0 ){.      
242b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
242c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
242d0 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
242e0 6e 6f 2c 20 22 63 79 67 77 69 6e 5f 63 6f 6e 76  no, "cygwin_conv
242f0 5f 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20  _path",.        
24300 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
24310 69 76 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ive);.      retu
24320 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24330 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
24340 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
24360 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
24370 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
24380 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
24390 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
243a0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
243b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
243c0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
243d0 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
243e0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
243f0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
24400 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
24410 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
24420 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
24430 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
24440 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
24450 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
24460 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
24470 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
24480 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
24490 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
244a0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
244b0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
244c0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
244d0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
244e0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
244f0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
24500 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
24510 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
24520 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
24530 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
24540 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
24550 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
24560 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
24570 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
24580 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
24590 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
245a0 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
245b0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
245c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
245d0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
245e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
245f0 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25 73 22 2c  zFull, "%s%s%s",
24600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
24620 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
24630 6e 47 65 74 44 69 72 44 65 70 28 29 2c 20 7a 52  nGetDirDep(), zR
24640 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
24650 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
24660 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
24670 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
24680 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
24690 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
246a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
246b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
246c0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
246d0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
246e0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
246f0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
24700 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
24710 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24720 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
24730 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
24740 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
24750 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
24760 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
24770 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
24780 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
24790 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
247a0 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
247b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
247c0 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
247d0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68  && sqlite3Isalph
247e0 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20  a(zRelative[1]) 
247f0 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d  && zRelative[2]=
24800 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c  =':' ){.    zRel
24810 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
24820 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
24830 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
24840 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
24850 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
24860 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
24870 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
24880 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
24890 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
248a0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
248b0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
248c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
248d0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
248e0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
248f0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
24900 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
24910 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
24920 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
24930 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
24940 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
24950 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
24960 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
24970 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
24980 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
24990 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
249a0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
249b0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
249c0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
249d0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
249e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
249f0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
24a00 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
24a10 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
24a20 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
24a30 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
24a40 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
24a50 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
24a60 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
24a70 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
24a80 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
24a90 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
24aa0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
24ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24ac0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
24ad0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
24ae0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73  e), zFull, "%s%s
24af0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
24b00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24b10 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
24b20 2c 20 77 69 6e 47 65 74 44 69 72 44 65 70 28 29  , winGetDirDep()
24b30 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
24b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24b50 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
24b60 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
24b70 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  tUtf8Filename(zR
24b80 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
24b90 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
24ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24bb0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24bc0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
24bd0 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52  () ){.    LPWSTR
24be0 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74   zTemp;.    nByt
24bf0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
24c00 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
24c10 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
24c20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
24c30 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
24c40 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
24c50 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c  TE_ERROR, osGetL
24c60 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47                "G
24c80 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 31  etFullPathNameW1
24c90 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ", zConverted);.
24ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24cb0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24cd0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
24ce0 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  LPATH;.    }.   
24cf0 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
24d00 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
24d10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
24d20 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
24d30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
24d40 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
24d50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24d60 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
24d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24d80 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
24d90 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
24da0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
24db0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
24dc0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
24dd0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
24de0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
24df0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24e00 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
24e10 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24e30 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
24e40 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  2", zConverted);
24e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24e60 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24e80 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
24e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24ea0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
24eb0 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  H;.    }.    sql
24ec0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
24ed0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
24ee0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
24ef0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
24f00 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
24f10 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
24f20 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
24f30 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
24f40 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
24f50 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
24f60 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
24f70 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
24f80 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
24f90 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
24fa0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
24fb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73  SQLITE_ERROR, os
24fc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61    "GetFullPathNa
24ff0 6d 65 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65  meA1", zConverte
25000 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
25010 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25020 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
25030 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
25040 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d  _FULLPATH;.    }
25050 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
25060 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
25070 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
25080 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
25090 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
250a0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
250b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
250c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
250d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
250e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
250f0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
25100 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
25110 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
25120 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
25130 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
25140 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
25150 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
25160 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47  QLITE_ERROR, osG
25170 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
251a0 65 41 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  eA2", zConverted
251b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
251c0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
251d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
251e0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
251f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25200 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
25210 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ATH;.    }.    s
25220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
25230 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
25240 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
25250 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
25260 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
25270 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
25280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
25290 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
252a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
252b0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
252c0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
252d0 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
252e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
252f0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
25300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25310 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
25320 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
25330 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
25340 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
25350 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
25360 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
25370 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
25380 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
25390 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
253a0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
253b0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
253c0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
253d0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
253e0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
253f0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
25400 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
25410 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
25420 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
25430 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
25440 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
25450 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
25460 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
25470 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
25480 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
25490 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
254a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
254b0 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
254c0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
254d0 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 55 74  d = winConvertUt
254e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
254f0 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
25500 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
25510 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
25520 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
25530 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
25540 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
25550 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
25560 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61      h = osLoadPa
25570 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c  ckagedLibrary((L
25580 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
25590 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  d, 0);.#else.   
255a0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
255b0 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ryW((LPCWSTR)zCo
255c0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
255d0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
255e0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
255f0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20  I.  else{.    h 
25600 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41  = osLoadLibraryA
25610 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
25620 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
25630 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25640 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
25650 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
25660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
25670 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
25680 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
25690 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
256a0 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
256b0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
256c0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
256d0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
256e0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
256f0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
25700 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
25710 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25720 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
25730 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
25740 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
25750 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
25760 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
25770 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41  void))osGetProcA
25780 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
25790 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  pH, zSym);.}.sta
257a0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
257b0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
257c0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
257d0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
257e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
257f0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
25800 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
25810 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
25820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
25830 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
25840 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
25850 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
25860 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
25870 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
25880 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
25890 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
258a0 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
258b0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
258c0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
258d0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
258e0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
258f0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
25900 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
25910 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
25920 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
25930 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
25940 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
25950 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
25960 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
25970 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
25980 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
25990 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
259a0 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
259b0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
259c0 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
259d0 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
259e0 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
259f0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
25a00 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
25a10 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
25a20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
25a30 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
25a40 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
25a50 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  = osGetCurrentPr
25a60 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
25a70 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
25a80 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
25a90 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
25aa0 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69  eof(pid);.  }.#i
25ab0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
25ac0 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  T.  if( sizeof(U
25ad0 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d  LONGLONG)<=nBuf-
25ae0 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f  n ){.    ULONGLO
25af0 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  NG cnt = osGetTi
25b00 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20  ckCount64();.   
25b10 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
25b20 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
25b30 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
25b40 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
25b50 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
25b60 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
25b70 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
25b80 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
25b90 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
25ba0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
25bb0 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
25bc0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
25bd0 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  cnt);.  }.#endif
25be0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
25bf0 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
25c00 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
25c10 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
25c20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
25c30 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
25c40 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
25c50 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
25c60 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
25c70 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
25c80 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
25c90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
25ca0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
25cb0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
25cc0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
25cd0 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
25ce0 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
25cf0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25d00 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
25d10 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
25d20 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
25d30 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
25d40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25d50 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
25d60 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
25d70 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
25d80 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
25d90 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
25da0 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
25db0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
25dc0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
25dd0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
25de0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
25df0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
25e00 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
25e10 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
25e20 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
25e30 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
25e40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
25e50 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
25e60 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
25e70 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
25e80 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
25e90 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
25ea0 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
25eb0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
25ec0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
25ed0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
25ee0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
25ef0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
25f00 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
25f10 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
25f20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
25f30 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
25f40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
25f50 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
25f60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
25f70 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
25f80 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
25f90 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
25fa0 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
25fb0 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
25fc0 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
25fd0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
25fe0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
25ff0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
26000 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
26010 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
26020 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
26030 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
26040 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
26050 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
26060 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
26070 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
26080 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
26090 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
260a0 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
260b0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
260c0 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
260d0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
260e0 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
260f0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
26100 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
26110 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
26120 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
26130 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
26140 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
26150 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
26160 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
26170 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
26180 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
26190 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
261a0 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
261b0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
261c0 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
261d0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
261e0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
261f0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
26200 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
26210 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
26220 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
26230 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
26240 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
26250 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20  2BitValue = .   
26260 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
26270 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
26280 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
26290 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
262a0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
262b0 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
262c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
262d0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
262e0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
262f0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
26300 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
26310 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
26320 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
26330 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
26340 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
26350 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
26360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26370 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
26380 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
26390 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
263a0 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
263b0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
263c0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
263d0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
263e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
263f0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
26400 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
26410 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26420 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
26430 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
26440 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
26450 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
26460 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
26470 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
26480 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
26490 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
264a0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
264b0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
264c0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
264d0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
264e0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
264f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26500 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
26510 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
26520 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
26530 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
26540 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
26550 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
26560 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
26570 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
26580 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
26590 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
265a0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
265b0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
265c0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
265d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
265e0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
265f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
26600 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
26610 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
26620 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
26630 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
26640 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
26650 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
26660 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
26670 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
26680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26690 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
266a0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
266b0 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
266c0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
266d0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
266e0 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
266f0 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
26700 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
26710 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
26720 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
26730 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26740 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
26750 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
26760 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
26770 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
26780 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
26790 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
267a0 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
267b0 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
267c0 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
267d0 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
267e0 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
267f0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
26800 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
26810 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
26820 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
26830 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
26840 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
26850 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
26860 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
26870 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
26880 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
26890 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
268a0 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
268b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
268c0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
268d0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
268e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
268f0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
26900 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
26910 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
26920 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
26930 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
26940 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
26950 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
26960 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
26970 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
26980 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
26990 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
269a0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
269b0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
269c0 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
269d0 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
269e0 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
269f0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
26a00 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
26a10 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
26a20 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
26a30 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
26a40 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
26a50 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
26a60 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
26a70 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
26a80 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
26a90 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
26aa0 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
26ab0 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
26ac0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
26ad0 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
26ae0 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
26af0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
26b00 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
26b10 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
26b20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
26b30 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
26b40 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
26b50 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26b60 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
26b70 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
26b80 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
26b90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
26ba0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
26bb0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
26bc0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
26bd0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
26be0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
26bf0 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c    return winGetL
26c00 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
26c10 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
26c20 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
26c30 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
26c40 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
26c50 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
26c60 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
26c70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
26c80 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
26c90 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
26ca0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
26cb0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
26cc0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
26cd0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
26ce0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
26cf0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
26d00 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
26d10 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
26d20 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
26d30 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
26d40 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
26d50 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
26d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26d70 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
26da0 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
26db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
26dc0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
26dd0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
26de0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
26df0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
26e00 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
26e10 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
26e20 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
26e30 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
26e40 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
26e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
26e60 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
26e70 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
26e80 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
26e90 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
26eb0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
26ec0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
26ed0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
26ee0 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
26ef0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
26f00 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
26f10 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
26f20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
26f30 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
26f40 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
26f50 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
26f60 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
26f70 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
26f80 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
26f90 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
26fa0 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
26fb0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
26fc0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
26fd0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
26fe0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
26ff0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
27000 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
27010 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
27020 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
27030 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
27040 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65  l */.  };.#if de
27050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
27060 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
27070 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
27080 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  s winLongPathVfs
27090 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
270b0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
270c0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
270d0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
270e0 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
270f0 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
27100 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
27110 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
27140 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
27150 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f  ,    /* zName */
27160 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
27170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
27180 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
27190 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
271a0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
271b0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
271c0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
271d0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
271e0 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
271f0 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
27200 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
27210 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
27220 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
27230 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
27240 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
27250 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
27260 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
27270 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
27280 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
27290 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
272a0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
272b0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
272c0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
272d0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
272e0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
272f0 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
27300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
27310 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
27320 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
27330 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
27340 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
27350 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
27360 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
27370 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
27380 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
27390 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
273a0 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
273b0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
273c0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
273d0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
273e0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
273f0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
27400 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
27410 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
27420 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
27430 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
27440 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
27450 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
27460 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
27470 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
27480 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
27490 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
274a0 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
274b0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
274c0 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29  (aSyscall)==74 )
274d0 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  ;..  /* get memo
274e0 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
274f0 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
27500 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
27510 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
27520 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
27530 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
27540 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76  NRT.  osGetNativ
27550 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  eSystemInfo(&win
27560 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  SysInfo);.#else.
27570 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66    osGetSystemInf
27580 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
27590 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
275a0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
275b0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
275c0 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ity>0 );.  asser
275d0 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
275e0 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20  PageSize>0 );.. 
275f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
27600 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31  ister(&winVfs, 1
27610 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
27620 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
27630 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
27640 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
27650 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30  inLongPathVfs, 0
27660 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
27670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
27680 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  }..int sqlite3_o
27690 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69  s_end(void){ .#i
276a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
276b0 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
276c0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  !=NULL ){.    os
276d0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
276e0 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
276f0 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
27700 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
27710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
27720 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
27730 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.