/ Hex Artifact Content
Login

Artifact 52bbfe7f96fdb61fa71ba6f96eac43bcdc5c29a8:


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: 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  Do we need to ma
09c0: 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74 68  nually define th
09d0: 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61 70  e Win32 file map
09e0: 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75 73  ping APIs for us
09f0: 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f  e with WAL.** mo
0a00: 64 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41  de (e.g. these A
0a10: 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  PIs are availabl
0a20: 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73  e in the Windows
0a30: 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 72   CE SDK; however
0a40: 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f  , they.** are no
0a50: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  t present in the
0a60: 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a   header file)?.*
0a70: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e  /.#if SQLITE_WIN
0a80: 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41  32_FILEMAPPING_A
0a90: 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  PI && !defined(S
0aa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
0ab0: 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65  /*.** Two of the
0ac0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50   file mapping AP
0ad0: 49 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  Is are different
0ae0: 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20 46   under WinRT.  F
0af0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 0a  igure out which.
0b00: 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e 0a  ** set we need..
0b10: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
0b20: 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41 50  _WINRT.WINBASEAP
0b30: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  I HANDLE WINAPI 
0b40: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
0b50: 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c  gFromApp(HANDLE,
0b60: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
0b70: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
0b80: 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34  , ULONG, ULONG64
0b90: 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e  , LPCWSTR);..WIN
0ba0: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
0bb0: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
0bc0: 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c  ileFromApp(HANDL
0bd0: 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36  E, ULONG, ULONG6
0be0: 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73  4, SIZE_T);.#els
0bf0: 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  e.#if defined(SQ
0c00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0c10: 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49 20  NSI).WINBASEAPI 
0c20: 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72  HANDLE WINAPI Cr
0c30: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
0c40: 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52  (HANDLE, LPSECUR
0c50: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
0c60: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
0c70: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c   DWORD, DWORD, L
0c80: 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f  PCSTR);.#endif /
0c90: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
0ca0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
0cb0: 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   */..#if defined
0cc0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0cd0: 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45 41  S_WIDE).WINBASEA
0ce0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
0cf0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
0d00: 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngW(HANDLE, LPSE
0d10: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0d20: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0d30: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0d40: 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e 64  , LPCWSTR);.#end
0d50: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
0d60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
0d70: 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45  IDE) */..WINBASE
0d80: 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50  API LPVOID WINAP
0d90: 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  I MapViewOfFile(
0da0: 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44  HANDLE, DWORD, D
0db0: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a  WORD, DWORD, SIZ
0dc0: 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_T);.#endif /* 
0dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
0de0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
0df0: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 20  ile mapping API 
0e00: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74  is common to bot
0e10: 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e 52  h Win32 and WinR
0e20: 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49  T..*/.WINBASEAPI
0e30: 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d   BOOL WINAPI Unm
0e40: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50 43  apViewOfFile(LPC
0e50: 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  VOID);.#endif /*
0e60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49   SQLITE_WIN32_FI
0e70: 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26 26  LEMAPPING_API &&
0e80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0e90: 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f  _OMIT_WAL) */../
0ea0: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
0eb0: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
0ec0: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
0ed0: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
0ee0: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
0ef0: 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65 20  IBUTES.# define 
0f00: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
0f10: 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 29  RIBUTES ((DWORD)
0f20: 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66  -1) .#endif..#if
0f30: 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  ndef FILE_FLAG_M
0f40: 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c  ASK.# define FIL
0f50: 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20  E_FLAG_MASK     
0f60: 20 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30       (0xFF3C0000
0f70: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
0f80: 66 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  f FILE_ATTRIBUTE
0f90: 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46  _MASK.# define F
0fa0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
0fb0: 53 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46  SK     (0x0003FF
0fc0: 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  F7).#endif..#ifn
0fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0fe0: 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  WAL./* Forward r
0ff0: 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70  eferences */.typ
1000: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
1010: 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20  hm winShm;      
1020: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63       /* A connec
1030: 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
1040: 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66  emory */.typedef
1050: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1060: 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20  de winShmNode;  
1070: 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20   /* A region of 
1080: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
1090: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
10a0: 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76  inCE lacks nativ
10b0: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69  e support for fi
10c0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65  le locking so we
10d0: 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74   have to fake it
10e0: 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f  .** with some co
10f0: 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a  de of our own..*
1100: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1110: 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74  WINCE.typedef st
1120: 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b  ruct winceLock {
1130: 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b  .  int nReaders;
1140: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1150: 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73   of reader locks
1160: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1170: 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20  OOL bPending;   
1180: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
1190: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  a pending lock h
11a0: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
11b0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65   */.  BOOL bRese
11c0: 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64  rved;     /* Ind
11d0: 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65  icates a reserve
11e0: 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  d lock has been 
11f0: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
1200: 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20  OL bExclusive;  
1210: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
1220: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1230: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1240: 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63  ed */.} winceLoc
1250: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  k;.#endif../*.**
1260: 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72   The winFile str
1270: 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63  ucture is a subc
1280: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1290: 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74  file* specific t
12a0: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70  o the win32.** p
12b0: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  ortability layer
12c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
12d0: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46  uct winFile winF
12e0: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46  ile;.struct winF
12f0: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71  ile {.  const sq
1300: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1310: 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20   *pMethod; /*** 
1320: 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a  Must be first **
1330: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
1340: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
1350: 54 68 65 20 56 46 53 20 75 73 65 64 20 74 6f 20  The VFS used to 
1360: 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  open this file *
1370: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
1380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1390: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
13a0: 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  ing the file */.
13b0: 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20    u8 locktype;  
13c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
13d0: 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e  e of lock curren
13e0: 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  tly held on this
13f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74   file */.  short
1400: 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b   sharedLockByte;
1410: 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63     /* Randomly c
1420: 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 20  hosen byte used 
1430: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1440: 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61   */.  u8 ctrlFla
1450: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
1460: 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e   Flags.  See WIN
1470: 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a  FILE_* below */.
1480: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1490: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  o;        /* The
14a0: 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
14b0: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
14c0: 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65   error */.#ifnde
14d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
14e0: 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d  L.  winShm *pShm
14f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
1500: 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65  nstance of share
1510: 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73  d memory on this
1520: 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
1530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1540: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c  ath;      /* Ful
1550: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1560: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
1570: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1580: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
1590: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ze configured by
15a0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
15b0: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
15c0: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54  OS_WINCE.  LPWST
15d0: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  R zDeleteOnClose
15e0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69  ;  /* Name of fi
15f0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65  le to delete whe
1600: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48  n closing */.  H
1610: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20  ANDLE hMutex;   
1620: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
1630: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
1640: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64  access to shared
1650: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e   lock */  .  HAN
1660: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
1670: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1680: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
1690: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
16a0: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
16b0: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
16c0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
16d0: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
16e0: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
16f0: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
1700: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
1710: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
1720: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
1730: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20    */.#endif.#if 
1740: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1750: 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65  SIZE>0.  int nFe
1760: 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20  tchOut;         
1770: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1780: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1790: 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
17a0: 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  s */.  HANDLE hM
17b0: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
17c0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
17d0: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d  or accessing mem
17e0: 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ory mapping */. 
17f0: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
1800: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
1810: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
1820: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
1830: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1840: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c  ;       /* Usabl
1850: 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64  e size of mapped
1860: 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c   region */.  sql
1870: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1880: 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63  izeActual; /* Ac
1890: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
18a0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
18b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
18c0: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a  apSizeMax;    /*
18d0: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
18e0: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
18f0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1900: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
1910: 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65  lues for winFile
1920: 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64  .ctrlFlags.*/.#d
1930: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44  efine WINFILE_RD
1940: 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78  ONLY          0x
1950: 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  02   /* Connecti
1960: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
1970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1980: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
1990: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
19a0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
19b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
19c0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
19d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
19e0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19f0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1a00: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1a10: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1a20: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1a30: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1a40: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1a50: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1a60: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1a70: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1a80: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
1a90: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
1aa0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
1ab0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
1ac0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
1ad0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1ae0: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
1af0: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
1b00: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1b10: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
1b20: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
1b30: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1b40: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1b50: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
1b60: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
1b70: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
1b80: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
1b90: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
1ba0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
1bb0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1bc0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1bd0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
1be0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
1bf0: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1c00: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1c10: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1c20: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1c40: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
1c50: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
1c60: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
1c70: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1c80: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
1c90: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
1ca0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
1cb0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
1cc0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
1cd0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
1ce0: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
1cf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1d00: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
1d10: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
1d20: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1d30: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
1d40: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
1d50: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
1d60: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
1d70: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
1d80: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
1d90: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
1da0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
1db0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
1dc0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
1dd0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
1de0: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
1df0: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
1e00: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
1e10: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
1e20: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
1e30: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
1e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
1e90: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
1ea0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
1eb0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
1ec0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
1ed0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
1ee0: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
1ef0: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
1f00: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
1f10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
1f20: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
1f30: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
1f40: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
1f50: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
1f60: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
1f70: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
1f80: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
1f90: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
1fa0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
1fb0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
1fc0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
1fd0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
1fe0: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
1ff0: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2000: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2010: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2060: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
2070: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2080: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
2090: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
20a0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
20b0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
20c0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
20d0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
20e0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
20f0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2100: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2120: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
2130: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2140: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
2150: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
2160: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
2170: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
21a0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
21b0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
21c0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
21d0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
21e0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
21f0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2200: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2210: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2220: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2230: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
2240: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2250: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2260: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
2270: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
2280: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
2290: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
22a0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
22b0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
22c0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
22d0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
22e0: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
22f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2300: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
2310: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2320: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
2330: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
2340: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
2350: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
2360: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
2370: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
2380: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
2390: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
23a0: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
23b0: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
23c0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
23d0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
23e0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
23f0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2400: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20    u32 magic;    
2410: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
2420: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
2430: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
2440: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
2450: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
2460: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
2470: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
2480: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
2490: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
24a0: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
24b0: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
24c0: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
24d0: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
24e0: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32  M_MAGIC     0x42
24f0: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73  b2830b.#endif..s
2500: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
2510: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
2520: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
2530: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
2540: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20  _MAGIC,.#endif. 
2550: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a   NULL, FALSE.};.
2560: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2570: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2580: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65  sertMagic() asse
2590: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
25a0: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  .magic==WINMEM_M
25b0: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65  AGIC ).#else.#de
25c0: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
25d0: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
25e0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
25f0: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d  etHeap() win_mem
2600: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61  _data.hHeap..sta
2610: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
2620: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
2630: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
2640: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
2650: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
2660: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
2670: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
2680: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
2690: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
26a0: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
26b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
26c0: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
26d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
26e0: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
26f0: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
2700: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
2710: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
2720: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
2730: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
2740: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
2750: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
2760: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
2770: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
2780: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2790: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72  variable is (nor
27a0: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20  mally) set once 
27b0: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  and never change
27c0: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e  s.** thereafter.
27d0: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65    It records whe
27e0: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  ther the operati
27f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
2800: 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a  9x.** or WinNT..
2810: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61  **.** 0:   Opera
2820: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e  ting system unkn
2830: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65  own..** 1:   Ope
2840: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2850: 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20   Win9x..** 2:   
2860: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
2870: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   is WinNT..**.**
2880: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   In order to fac
2890: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20  ilitate testing 
28a0: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65  on a WinNT syste
28b0: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74  m, the test fixt
28c0: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61  ure.** can manua
28d0: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c  lly set this val
28e0: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61  ue to 1 to emula
28f0: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f  te Win98 behavio
2900: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
2910: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2920: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
2930: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
2940: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
2950: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
2960: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
2970: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
2980: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
2990: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l_ptr.#endif../*
29a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29b0: 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  n is not availab
29c0: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
29d0: 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a   or WinRT.. */..
29e0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29f0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
2a00: 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65  _WINRT.#  define
2a10: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
2a20: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e  SI()       1.#en
2a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20  dif../*.** Many 
2a40: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65  system calls are
2a50: 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67   accessed throug
2a60: 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e  h pointer-to-fun
2a70: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a  ctions so that.*
2a80: 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76  * they may be ov
2a90: 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74  erridden at runt
2aa0: 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ime to facilitat
2ab0: 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  e fault injectio
2ac0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  n during.** test
2ad0: 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69  ing and sandboxi
2ae0: 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ng.  The followi
2af0: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74  ng array holds t
2b00: 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69  he names and poi
2b10: 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20  nters.** to all 
2b20: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
2b30: 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74  tem calls..*/.st
2b40: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f  atic struct win_
2b50: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
2b60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
2b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2b80: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2b90: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2ba0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
2bb0: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
2bc0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
2bd0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
2be0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2bf0: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
2c00: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
2c10: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
2c20: 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  = {.#if !SQLITE_
2c30: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2c40: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
2c50: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
2c60: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
2c70: 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73  CALL)AreFileApis
2c80: 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20  ANSI,         0 
2c90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72  },.#else.  { "Ar
2ca0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
2cb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2cc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2cd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2ce0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
2cf0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
2d00: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
2d10: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
2d20: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
2d30: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
2d40: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
2d50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2d60: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
2d70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2d80: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f  IDE).  { "CharLo
2d90: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
2da0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
2db0: 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20  rLowerW,        
2dc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2dd0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
2de0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2df0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2e20: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77  define osCharLow
2e30: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
2e40: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
2e50: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2e60: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
2e70: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2e80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2e90: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
2ea0: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
2eb0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2ec0: 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20  LL)CharUpperW,  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2ee0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
2ef0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
2f00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2f30: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2f40: 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53  harUpperW ((LPWS
2f50: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
2f60: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  TR))aSyscall[2].
2f70: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2f80: 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20  CloseHandle",   
2f90: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2fa0: 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20  LL)CloseHandle, 
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2fc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ..#define osClos
2fd0: 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57  eHandle ((BOOL(W
2fe0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
2ff0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
3000: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3010: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3020: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43  HAS_ANSI).  { "C
3030: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
3040: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3050: 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20  L)CreateFileA,  
3060: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3070: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3080: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
3090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
30c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
30d0: 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44  eateFileA ((HAND
30e0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
30f0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  TR,DWORD,DWORD, 
3100: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
3110: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
3120: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44  DWORD,DWORD,HAND
3130: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  LE))aSyscall[4].
3140: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3150: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3160: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3170: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3180: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3190: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
31a0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
31b0: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
31c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
31d0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
31f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3210: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3220: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3230: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3240: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
3250: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
3260: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
3270: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
3280: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
3290: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
32a0: 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45  t)..#if (!SQLITE
32b0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
32c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
32d0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c  2_HAS_ANSI) && \
32e0: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
32f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3300: 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  L)).  { "CreateF
3310: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3320: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3330: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
3340: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3350: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
3360: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
3370: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33a0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
33b0: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
33c0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
33d0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
33e0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
33f0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
3400: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
3410: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
3420: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3430: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
3440: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3450: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3460: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3470: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3490: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
34a0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
34b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
34c0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
34d0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
34e0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
34f0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3500: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3530: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3540: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
3550: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3560: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
3570: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
3580: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
3590: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
35a0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
35b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
35c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
35d0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
35e0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
35f0: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  E).  { "CreateMu
3600: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
3610: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3620: 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20  eMutexW,        
3630: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3640: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
3650: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3660: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3690: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74  fine osCreateMut
36a0: 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  exW ((HANDLE(WIN
36b0: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
36c0: 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c  _ATTRIBUTES,BOOL
36d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57  , \.        LPCW
36e0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  STR))aSyscall[8]
36f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3710: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3720: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
3730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3740: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
3750: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
3760: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3770: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
3780: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3790: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
37b0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
37c0: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28   osDeleteFileA (
37d0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
37e0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
37f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3800: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3810: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3820: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
3830: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3840: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
3850: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3860: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3870: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
3880: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3890: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
38b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
38c0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57  ne osDeleteFileW
38d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
38e0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
38f0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3900: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3910: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
3920: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
3930: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69  me", (SYSCALL)Fi
3940: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
3950: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
3960: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
3970: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
3980: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
39b0: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
39c0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
39d0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
39e0: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
39f0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
3a00: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
3a10: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3a20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3a30: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
3a40: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
3a50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c      (SYSCALL)Fil
3a60: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
3a70: 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  e,    0 },.#else
3a80: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
3a90: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
3aa0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3ad0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
3ae0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28  eToSystemTime ((
3af0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
3b00: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
3b20: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
3b30: 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  12].pCurrent).. 
3b40: 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66   { "FlushFileBuf
3b50: 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53  fers",        (S
3b60: 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65  YSCALL)FlushFile
3b70: 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20  Buffers,        
3b80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3b90: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
3ba0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3bb0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
3bc0: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
3bd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3be0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3bf0: 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  SI).  { "FormatM
3c00: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
3c10: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
3c20: 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20  atMessageA,     
3c30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3c40: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
3c50: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
3c60: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3c90: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
3ca0: 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57  ssageA ((DWORD(W
3cb0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3cc0: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
3cd0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
3ce0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
3cf0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
3d00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3d20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3d30: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
3d40: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
3d50: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
3d60: 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30  ageW,          0
3d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
3d80: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
3d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3da0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3dc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3dd0: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
3de0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3df0: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
3e00: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53  DWORD,DWORD,LPWS
3e10: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
3e20: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
3e30: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
3e40: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
3e50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
3e60: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
3e70: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
3e80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3e90: 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61  YSCALL)FreeLibra
3ea0: 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ry,             
3eb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3ec0: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
3ed0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3ee0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3f00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3f10: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
3f20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
3f30: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
3f40: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
3f50: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
3f60: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
3f70: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
3f80: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
3f90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3fa0: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
3fb0: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
3fc0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3fd0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
3fe0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3ff0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4000: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4010: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4020: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4030: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4040: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4050: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
4060: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4070: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4080: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
40a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
40b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
40c0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
40d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
40e0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
40f0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4100: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4110: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
4120: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4130: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4140: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4150: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4160: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4170: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
4180: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4190: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
41a0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
41b0: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
41c0: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
41d0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
41e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4210: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
4220: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
4230: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4240: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
4250: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4260: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
4270: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
4280: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4290: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
42a0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
42b0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
42c0: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
42d0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
42e0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
42f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4300: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
4310: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4320: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4330: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4340: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4350: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4360: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
4370: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4380: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4390: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
43a0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
43b0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
43c0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
43d0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
43e0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
43f0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4400: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
4410: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4420: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4430: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4450: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4460: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4470: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4480: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4490: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
44a0: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
44b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
44c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
44d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
44e0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
44f0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
4500: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4510: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
4520: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
4530: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
4540: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4570: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
4580: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
4590: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
45a0: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
45b0: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
45c0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
45d0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
45e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
45f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4600: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
4610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4620: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
4630: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
4640: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4650: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
4660: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4670: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4680: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4690: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
46a0: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
46b0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
46c0: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
46d0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
46e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
46f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4710: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4720: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4730: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
4740: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
4750: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
4760: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4770: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4780: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4790: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
47b0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
47c0: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
47d0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
47e0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
47f0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
4800: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
4810: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
4820: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4830: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
4840: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4850: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4860: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4870: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
4880: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
4890: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
48a0: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
48b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
48c0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
48d0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
48e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
48f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4900: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4910: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
4920: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4930: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
4940: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
4950: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
4960: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
4970: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
4980: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
4990: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
49a0: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
49b0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
49c0: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
49d0: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
49e0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
49f0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
4a00: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4a10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
4a20: 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53  EXTENSION).#if S
4a30: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
4a40: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
4a50: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
4a60: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
4a70: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
4a80: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
4a90: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
4aa0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4ab0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
4ac0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4ad0: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
4ae0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
4af0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
4b00: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
4b10: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
4b20: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
4b30: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
4b40: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
4b50: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
4b60: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
4b70: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
4b80: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
4b90: 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  },.#endif.#else.
4ba0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
4bb0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
4bc0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4bf0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
4c00: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
4c10: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
4c20: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
4c30: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
4c40: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
4c50: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4c60: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
4c70: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
4c80: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
4c90: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
4ca0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4cb0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
4cc0: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
4cd0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4d00: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
4d10: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
4d20: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
4d30: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d  FO))aSyscall[28]
4d40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4d50: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
4d60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4d70: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
4d80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
4d90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
4da0: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
4db0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
4dc0: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
4dd0: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
4de0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4df0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
4e00: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
4e10: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
4e20: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
4e30: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
4e40: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
4e50: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
4e60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4e90: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
4ea0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4eb0: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
4ec0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
4ed0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
4ee0: 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[30].pCurrent).
4ef0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4f00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4f10: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
4f20: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
4f30: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
4f40: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
4f50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4f60: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4f70: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4f80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4fb0: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
4fc0: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
4fd0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
4fe0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e  R))aSyscall[31].
4ff0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5000: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5010: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5020: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5030: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5040: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5050: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5060: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
5070: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5080: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
50a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
50c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
50d0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
50e0: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
50f0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
5100: 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70  ))aSyscall[32].p
5110: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5120: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5130: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5140: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5150: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
5160: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
5170: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5180: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5190: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
51a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
51c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
51d0: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
51e0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
51f0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5200: 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  33].pCurrent)..#
5210: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5220: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5230: 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  ).  { "GetVersio
5240: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5250: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5260: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5270: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5280: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5290: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
52a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
52c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
52d0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
52e0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
52f0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5300: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5310: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5320: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
5330: 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  apAlloc",       
5340: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5350: 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20  )HeapAlloc,     
5360: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5370: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c  #define osHeapAl
5380: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
5390: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
53a0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
53b0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
53c0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
53d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
53e0: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  RT.  { "HeapCrea
53f0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5400: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
5410: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
5420: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5430: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5450: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5480: 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74  fine osHeapCreat
5490: 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  e ((HANDLE(WINAP
54a0: 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54  I*)(DWORD,SIZE_T
54b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
54c0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d  _T))aSyscall[36]
54d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
54e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
54f0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
5500: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5510: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73  (SYSCALL)HeapDes
5520: 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20  troy,           
5530: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5540: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
5550: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5560: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5580: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5590: 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ne osHeapDestroy
55a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
55b0: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
55c0: 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[37].pCurrent).
55d0: 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c  .  { "HeapFree",
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65  (SYSCALL)HeapFre
5600: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5610: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5620: 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f  osHeapFree ((BOO
5630: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5640: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29  E,DWORD,LPVOID))
5650: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
5660: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
5670: 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  pReAlloc",      
5680: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5690: 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20  HeapReAlloc,    
56a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
56b0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41  define osHeapReA
56c0: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
56d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
56e0: 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20  ORD,LPVOID, \.  
56f0: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
5700: 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72  yscall[39].pCurr
5710: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53  ent)..  { "HeapS
5720: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
5730: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
5740: 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  apSize,         
5750: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5760: 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20  fine osHeapSize 
5770: 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a  ((SIZE_T(WINAPI*
5780: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
5790: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
57a0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e  D))aSyscall[40].
57b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
57c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
57d0: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
57f0: 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69  SYSCALL)HeapVali
5800: 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
5810: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5820: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
5830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5840: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5860: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5870: 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  e osHeapValidate
5880: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5890: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
58a0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
58b0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
58c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
58d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
58e0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
58f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5900: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
5910: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
5920: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
5930: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
5940: 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20  dLibraryA,      
5950: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5960: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
5970: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
5980: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
59b0: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
59c0: 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28  raryA ((HMODULE(
59d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
59e0: 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43  )aSyscall[42].pC
59f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5a00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5a10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5a20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5a30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
5a40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5a50: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
5a60: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
5a70: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
5a80: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
5a90: 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20  braryW,         
5aa0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5ab0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
5ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5ad0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5af0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5b00: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
5b10: 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yW ((HMODULE(WIN
5b20: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
5b30: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72  Syscall[43].pCur
5b40: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5b50: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5b60: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
5b70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5b80: 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20  ALL)LocalFree,  
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5ba0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
5bb0: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
5bc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5bd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5be0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5bf0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5c00: 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43  LocalFree ((HLOC
5c10: 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43  AL(WINAPI*)(HLOC
5c20: 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d  AL))aSyscall[44]
5c30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5c50: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
5c60: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  INRT.  { "LockFi
5c70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
5c80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
5c90: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
5ca0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5cb0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5d00: 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c  ifndef osLockFil
5d10: 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  e.#define osLock
5d20: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5d30: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5d40: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
5d50: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
5d60: 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75  aSyscall[45].pCu
5d70: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
5d80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5d90: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
5da0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
5dc0: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
5dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5de0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
5df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
5e00: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
5e30: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
5e40: 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  Ex.#define osLoc
5e50: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
5e60: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5e70: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
5e80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5e90: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
5ea0: 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75  aSyscall[46].pCu
5eb0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
5ec0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5ed0: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
5ee0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
5ef0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5f00: 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69  WAL)).  { "MapVi
5f10: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
5f30: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f50: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
5f60: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5f70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5fa0: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
5fb0: 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44  wOfFile ((LPVOID
5fc0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5fd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5fe0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
5ff0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6000: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
6010: 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  { "MultiByteToWi
6020: 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59  deChar",     (SY
6030: 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54  SCALL)MultiByteT
6040: 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30  oWideChar,     0
6050: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
6060: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6070: 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  ar ((int(WINAPI*
6080: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
6090: 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20  STR,int,LPWSTR, 
60a0: 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61  \.        int))a
60b0: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
60c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72  rent)..  { "Quer
60d0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
60e0: 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51  ter", (SYSCALL)Q
60f0: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6100: 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64  ounter, 0 },..#d
6110: 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72  efine osQueryPer
6120: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
6130: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6140: 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45   \.        LARGE
6150: 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63  _INTEGER*))aSysc
6160: 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74  all[49].pCurrent
6170: 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65  )..  { "ReadFile
6180: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6190: 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46    (SYSCALL)ReadF
61a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
61b0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
61c0: 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42  e osReadFile ((B
61d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
61e0: 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  DLE,LPVOID,DWORD
61f0: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
6200: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6210: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
6220: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6230: 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20  etEndOfFile",   
6240: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6250: 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20  L)SetEndOfFile, 
6260: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6270: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e  .#define osSetEn
6280: 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  dOfFile ((BOOL(W
6290: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
62a0: 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75  aSyscall[51].pCu
62b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
62c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
62d0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
62e0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
62f0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
6300: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
6310: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
6320: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
6330: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6340: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6350: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6360: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6370: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20  sSetFilePointer 
6380: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6390: 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f  (HANDLE,LONG,PLO
63a0: 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  NG, \.        DW
63b0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32  ORD))aSyscall[52
63c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
63d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
63e0: 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  T.  { "Sleep",  
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c   (SYSCALL)Sleep,
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6430: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6450: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6470: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6480: 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f  ine osSleep ((VO
6490: 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  ID(WINAPI*)(DWOR
64a0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e  D))aSyscall[53].
64b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
64c0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
64d0: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
64e0: 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  LL)SystemTimeToF
64f0: 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  ileTime,    0 },
6500: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74  ..#define osSyst
6510: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
6520: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6530: 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d  (CONST SYSTEMTIM
6540: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
6550: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
6560: 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[54].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 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6590: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
65a0: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
65b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65c0: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20  LL)UnlockFile,  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
65f0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
6600: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6620: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6630: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55  dif..#ifndef osU
6640: 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e  nlockFile.#defin
6650: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28  e osUnlockFile (
6660: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6670: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6680: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6690: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
66a0: 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[55].pCurrent)
66b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
66c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
66d0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
66e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
66f0: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
6700: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  Ex,            0
6710: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
6720: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
6730: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6740: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6760: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6770: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28  osUnlockFileEx (
6780: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6790: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
67a0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
67b0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
67c0: 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43  )aSyscall[56].pC
67d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
67e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
67f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6800: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55  OMIT_WAL).  { "U
6810: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
6820: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6830: 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  L)UnmapViewOfFil
6840: 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  e,         0 },.
6850: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70  #else.  { "Unmap
6860: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6870: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
68a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
68b0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  mapViewOfFile ((
68c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
68d0: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
68e0: 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  57].pCurrent).. 
68f0: 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75   { "WideCharToMu
6900: 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53  ltiByte",     (S
6910: 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54  YSCALL)WideCharT
6920: 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20  oMultiByte,     
6930: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6940: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
6950: 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49  yte ((int(WINAPI
6960: 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50  *)(UINT,DWORD,LP
6970: 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c  CWSTR,int,LPSTR,
6980: 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  int, \.        L
6990: 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53  PCSTR,LPBOOL))aS
69a0: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
69b0: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65  ent)..  { "Write
69c0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
69d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72       (SYSCALL)Wr
69e0: 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20  iteFile,        
69f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6a00: 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65  fine osWriteFile
6a10: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6a20: 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c  (HANDLE,LPCVOID,
6a30: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
6a40: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6a50: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6a60: 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  59].pCurrent)..#
6a70: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6a80: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  RT.  { "CreateEv
6a90: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
6aa0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
6ab0: 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20  eEventExW,      
6ac0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6ad0: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
6ae0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  xW",          (S
6af0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6b20: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65  fine osCreateEve
6b30: 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57  ntExW ((HANDLE(W
6b40: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
6b50: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50  TY_ATTRIBUTES,LP
6b60: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
6b70: 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53   DWORD,DWORD))aS
6b80: 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72  yscall[60].pCurr
6b90: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6ba0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6bb0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6bc0: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
6bd0: 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  LL)WaitForSingle
6be0: 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c  Object,     0 },
6bf0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74  .#else.  { "Wait
6c00: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22  ForSingleObject"
6c10: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
6c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6c30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6c40: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57  dif..#define osW
6c50: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6c60: 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  ct ((DWORD(WINAP
6c70: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
6c80: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
6c90: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
6ca0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6cb0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
6cc0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6cd0: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
6ce0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
6cf0: 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23  jectEx,   0 },.#
6d00: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
6d10: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22  rSingleObjectEx"
6d20: 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  ,   (SYSCALL)0, 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6d50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
6d60: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6d70: 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Ex ((DWORD(WINAP
6d80: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6d90: 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c  , \.        BOOL
6da0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70  ))aSyscall[62].p
6db0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6dc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6dd0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
6de0: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
6df0: 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69  SCALL)SetFilePoi
6e00: 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30  nterEx,        0
6e10: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
6e20: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
6e30: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
6e40: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6e50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6e60: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6e70: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
6e80: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
6e90: 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f  *)(HANDLE,LARGE_
6ea0: 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20  INTEGER, \.     
6eb0: 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45     PLARGE_INTEGE
6ec0: 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  R,DWORD))aSyscal
6ed0: 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[63].pCurrent).
6ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6ef0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c  INRT.  { "GetFil
6f00: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
6f10: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
6f20: 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  L)GetFileInforma
6f30: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20  tionByHandleEx, 
6f40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6f50: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6f60: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
6f70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6f90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6fa0: 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d   osGetFileInform
6fb0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20  ationByHandleEx 
6fc0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6fd0: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
6fe0: 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48    FILE_INFO_BY_H
6ff0: 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f  ANDLE_CLASS,LPVO
7000: 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ID,DWORD))aSysca
7010: 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[64].pCurrent)
7020: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7030: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
7040: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7050: 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  L).  { "MapViewO
7060: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
7070: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
7080: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c  ewOfFileFromApp,
7090: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
70a0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
70b0: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
70c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
70f0: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
7100: 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50  FileFromApp ((LP
7110: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
7120: 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  NDLE,ULONG,ULONG
7130: 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  64, \.        SI
7140: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36  ZE_T))aSyscall[6
7150: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
7160: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7170: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  T.  { "CreateFil
7180: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
7190: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
71a0: 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20  File2,          
71b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
71c0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
71e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7200: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7210: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7220: 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  2 ((HANDLE(WINAP
7230: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
7240: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7250: 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54  .        LPCREAT
7260: 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
7270: 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73  PARAMETERS))aSys
7280: 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e  call[66].pCurren
7290: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
72a0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
72b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
72c0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
72d0: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
72e0: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
72f0: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b  SYSCALL)LoadPack
7300: 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20  agedLibrary,    
7310: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7320: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
7330: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
7340: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7360: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7370: 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  e osLoadPackaged
7380: 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c  Library ((HMODUL
7390: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
73a0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
73b0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37  ORD))aSyscall[67
73c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
73d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
73e0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
73f0: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
7400: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
7410: 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20  Count64,        
7420: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7430: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
7440: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7450: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7470: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7480: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
7490: 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28  t64 ((ULONGLONG(
74a0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
74b0: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
74c0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
74d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
74e0: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
74f0: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
7500: 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74  LL)GetNativeSyst
7510: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c  emInfo,     0 },
7520: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e  .#else.  { "GetN
7530: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
7540: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
7550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7560: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7570: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
7580: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7590: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
75a0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
75b0: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
75c0: 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65  scall[69].pCurre
75d0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
75e0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
75f0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74  S_ANSI).  { "Out
7600: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
7610: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
7620: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
7630: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
7640: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
7650: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
7660: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7690: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
76a0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28  utDebugStringA (
76b0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
76c0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
76d0: 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  70].pCurrent)..#
76e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
76f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
7700: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
7710: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
7720: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
7730: 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20  DebugStringW,   
7740: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7750: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
7760: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
7770: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7790: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
77a0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
77b0: 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28  gStringW ((VOID(
77c0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
77d0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70  ))aSyscall[71].p
77e0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
77f0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20  etProcessHeap", 
7800: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7810: 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  L)GetProcessHeap
7820: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
7830: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
7840: 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44  ocessHeap ((HAND
7850: 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  LE(WINAPI*)(VOID
7860: 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70  ))aSyscall[72].p
7870: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7880: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7890: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
78a0: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22  _OMIT_WAL).  { "
78b0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
78c0: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
78d0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
78e0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20  ppingFromApp, 0 
78f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7900: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
7910: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
7920: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7930: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7940: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7950: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
7960: 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44  ngFromApp ((HAND
7970: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
7980: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
7990: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
79a0: 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  TES,ULONG,ULONG6
79b0: 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  4,LPCWSTR))aSysc
79c0: 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74  all[73].pCurrent
79d0: 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  )..}; /* End of 
79e0: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
79f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
7a00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
7a10: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
7a20: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
7a30: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
7a40: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69  ll of the.** "wi
7a50: 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74  n32" VFSes.  Ret
7a60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70  urn SQLITE_OK op
7a70: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  on successfully 
7a80: 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20  updating the.** 
7a90: 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e  system call poin
7aa0: 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ter, or SQLITE_N
7ab0: 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65  OTFOUND if there
7ac0: 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61   is no configura
7ad0: 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  ble.** system ca
7ae0: 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  ll named zName..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
7b00: 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nSetSystemCall(.
7b10: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
7b20: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
7b30: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
7b40: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
7b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7b60: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
7b70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
7b80: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
7b90: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
7ba0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
7bb0: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
7bc0: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
7bd0: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
7be0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7bf0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
7c00: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
7c10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7c20: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
7c30: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
7c40: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
7c50: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
7c60: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
7c70: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
7c80: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
7c90: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
7ca0: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
7cb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7cc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7cd0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
7ce0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
7cf0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7d00: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
7d10: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
7d20: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
7d30: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
7d40: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
7d50: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
7d60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
7d70: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
7d80: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
7d90: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
7da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
7db0: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
7dc0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
7dd0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
7de0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
7df0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
7e00: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
7e10: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
7e20: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
7e30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
7e40: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
7e50: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
7e60: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7e70: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
7e80: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
7e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ea0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7eb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
7ec0: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
7ed0: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
7ee0: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
7ef0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7f00: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
7f10: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
7f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7f30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7f40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
7f50: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
7f60: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
7f70: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
7f80: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
7f90: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
7fa0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
7fb0: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
7fc0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
7fd0: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
7fe0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
7ff0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
8000: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8010: 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61  r winGetSystemCa
8020: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
8030: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63  s *pNotUsed,.  c
8040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8050: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
8060: 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  nt i;..  UNUSED_
8070: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
8080: 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ed);.  for(i=0; 
8090: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
80a0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
80b0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
80c0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
80d0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
80e0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
80f0: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  rn aSyscall[i].p
8100: 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  Current;.  }.  r
8110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8120: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
8130: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
8140: 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72  ystem call after
8150: 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d   zName.  If zNam
8160: 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  e==NULL.** then 
8170: 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  return the name 
8180: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
8190: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
81a0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a  n NULL if zName.
81b0: 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73  ** is the last s
81c0: 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66  ystem call or if
81d0: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68   zName is not th
81e0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
81f0: 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  d.** system call
8200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8210: 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53  t char *winNextS
8220: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
8230: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
8240: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
8250: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
8260: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8270: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
8280: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
8290: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
82a0: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
82b0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
82c0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
82d0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
82e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
82f0: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
8300: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
8310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8320: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
8330: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
8340: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
8350: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
8360: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
8370: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
8380: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
8390: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
83a0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
83b0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
83c0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
83d0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
83e0: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
83f0: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
8400: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
8410: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
8420: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
8430: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
8440: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
8450: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8460: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
8470: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
8480: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
8490: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
84a0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
84b0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
84c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
84d0: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
84e0: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
84f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8500: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
8510: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8520: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
8530: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
8540: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
8550: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8560: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
8570: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
8580: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
8590: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
85a0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
85b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
85c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
85d0: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
85e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
85f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
8600: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
8610: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
8620: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
8630: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
8640: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
8650: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
8660: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
8670: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
8680: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
8690: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
86a0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
86b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
86c0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
86d0: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
86e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
86f0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8700: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
8710: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
8720: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
8730: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
8740: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
8750: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
8760: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
8770: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
8780: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8790: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
87a0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
87b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
87c0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
87d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
87e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
87f0: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
8800: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
8810: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
8820: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
8830: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
8840: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
8850: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
8860: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
8870: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8880: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
8890: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
88a0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
88b0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
88c0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
88d0: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
88e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
88f0: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
8900: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
8910: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
8920: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
8930: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
8940: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
8970: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
8980: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
8990: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
89a0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
89b0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
89c0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
89d0: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
89e0: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
89f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8a00: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
8a10: 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72  n-zero) if we ar
8a20: 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20  e running under 
8a30: 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69  WinNT, Win2K, Wi
8a40: 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45  nXP,.** or WinCE
8a50: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
8a60: 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35  (zero) for Win95
8a70: 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d  , Win98, or WinM
8a80: 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  E..**.** Here is
8a90: 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20   an interesting 
8aa0: 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69  observation:  Wi
8ab0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20  n95, Win98, and 
8ac0: 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68  WinME lack.** th
8ad0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
8ae0: 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20  PI.  But we can 
8af0: 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79  still statically
8b00: 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68   link against th
8b10: 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e  at.** API as lon
8b20: 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61  g as we don't ca
8b30: 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69  ll it when runni
8b40: 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20  ng Win95/98/ME. 
8b50: 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68   A call to.** th
8b60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8b70: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
8b80: 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57  if the host is W
8b90: 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a  in95/98/ME or.**
8ba0: 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20   WinNT/2K/XP so 
8bb0: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  that we will kno
8bc0: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
8bd0: 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63   we can safely c
8be0: 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  all.** the LockF
8bf0: 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a  ileEx() API..*/.
8c00: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8c10: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
8c20: 5f 57 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20  _WINRT.# define 
8c30: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  isNT()  (1).#eli
8c40: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8c50: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
8c60: 29 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28  ).# define isNT(
8c70: 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73  )  (0).#else.  s
8c80: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76  tatic int isNT(v
8c90: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71  oid){.    if( sq
8ca0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30  lite3_os_type==0
8cb0: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53   ){.      OSVERS
8cc0: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
8cd0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
8ce0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
8cf0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
8d00: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
8d10: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a  ionExA(&sInfo);.
8d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
8d30: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
8d40: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
8d50: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
8d60: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
8d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
8d80: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
8d90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
8da0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
8db0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c  MALLOC./*.** All
8dc0: 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20  ocate nBytes of 
8dd0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
8de0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
8df0: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
8e00: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
8e10: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
8e20: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8e30: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8e40: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8e50: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8e60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8e70: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8e80: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8e90: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8ea0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
8eb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
8ec0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
8ed0: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
8ee0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
8ef0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8f00: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
8f10: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
8f20: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
8f30: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
8f40: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8f50: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8f60: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
8f70: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
8f80: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
8f90: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
8fa0: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
8fb0: 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68  %u bytes (%d), h
8fc0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
8fd0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c           nBytes,
8fe0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
8ff0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
9000: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
9020: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
9030: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
9040: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b  e(void *pPrior){
9050: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
9060: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
9070: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
9080: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
9090: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
90a0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
90b0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
90c0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
90d0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
90e0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
90f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9100: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
9110: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
9120: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
9130: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9140: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
9150: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
9160: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
9170: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
9180: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
9190: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
91a0: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
91b0: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
91c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
91d0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
91e0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
91f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
9200: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
9210: 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20   block %p (%d), 
9220: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
9230: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
9240: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
9250: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9260: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9270: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
9280: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  of an existing m
9290: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
92a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
92b0: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
92c0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
92d0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
92e0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
92f0: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
9300: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
9310: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
9320: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
9330: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
9340: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
9350: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9360: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9370: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9380: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9390: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
93a0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
93b0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
93c0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
93d0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
93e0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
93f0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9400: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
9410: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
9420: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
9430: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
9440: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
9450: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
9460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
9470: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
9480: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
9490: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
94a0: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
94b0: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
94c0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
94d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
94e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
94f0: 73 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c  s %u bytes (%d),
9500: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9510: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
9520: 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63  r ? "HeapReAlloc
9530: 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c  " : "HeapAlloc",
9540: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
9550: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
9560: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
9570: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
9580: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
9590: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
95a0: 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e  ze of an outstan
95b0: 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  ding allocation,
95c0: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74   in bytes..*/.st
95d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
95e0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  ize(void *p){.  
95f0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
9600: 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e  SIZE_T n;..  win
9610: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
9620: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
9630: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
9640: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
9650: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9660: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
9670: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
9680: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9690: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
96a0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
96b0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
96c0: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
96d0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
96e0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
96f0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
9700: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
9710: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
9720: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
9730: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9740: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
9750: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
9760: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
9770: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9780: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
9790: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
97a0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  p, osGetLastErro
97d0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
97e0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
97f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
9800: 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  int)n;.}../*.** 
9810: 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65  Round up a reque
9820: 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e  st size to the n
9830: 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61  ext valid alloca
9840: 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  tion size..*/.st
9850: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
9860: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20  oundup(int n){. 
9870: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
9880: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
9890: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
98a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
98b0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
98c0: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
98d0: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
98e0: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
98f0: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
9900: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
9910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9920: 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ROR;.  assert( p
9930: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
9940: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
9950: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
9960: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
9970: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
9980: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
9990: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
99a0: 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  {.    pWinMemDat
99b0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61  a->hHeap = osHea
99c0: 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57  pCreate(SQLITE_W
99d0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
99e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
9a10: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
9a20: 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE,.            
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9a50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
9a60: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21  SIZE);.    if( !
9a70: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9a80: 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ap ){.      sqli
9a90: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9aa0: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20  OMEM,.          
9ab0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
9ac0: 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67  reate (%d), flag
9ad0: 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25  s=%u, initSize=%
9ae0: 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a  u, maxSize=%u",.
9af0: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
9b00: 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49  astError(), SQLI
9b10: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9b20: 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53  AGS,.          S
9b30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9b40: 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49  _INIT_SIZE, SQLI
9b50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
9b60: 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  X_SIZE);.      r
9b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9b80: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  EM;.    }.    pW
9b90: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
9ba0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73  d = TRUE;.    as
9bb0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
9bc0: 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d  a->bOwned );.  }
9bd0: 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d  .#else.  pWinMem
9be0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
9bf0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29  GetProcessHeap()
9c00: 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ;.  if( !pWinMem
9c10: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
9c20: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
9c30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
9c40: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
9c50: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
9c60: 25 64 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45  %d)", osGetLastE
9c70: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74  rror());.    ret
9c80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9c90: 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44  ;.  }.  pWinMemD
9ca0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
9cb0: 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21  LSE;.  assert( !
9cc0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
9cd0: 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ned );.#endif.  
9ce0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
9cf0: 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b  ata->hHeap!=0 );
9d00: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
9d10: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
9d20: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9d30: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9d40: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9d50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9d60: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
9d70: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
9d80: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
9d90: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9da0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9db0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
9dc0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
9dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9de0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
9df0: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
9e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9e10: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
9e20: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
9e30: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
9e40: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
9e50: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
9e60: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
9e70: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
9e80: 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  n;.  if( pWinMem
9e90: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
9ea0: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
9eb0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
9ec0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9ed0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9ee0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9ef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9f00: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
9f10: 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28  ATE).    assert(
9f20: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
9f30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9f40: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
9f50: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
9f60: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  L) );.#endif.   
9f70: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
9f80: 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20  ->bOwned ){.    
9f90: 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73    if( !osHeapDes
9fa0: 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61  troy(pWinMemData
9fb0: 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20  ->hHeap) ){.    
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9fd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
9fe0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73  ailed to HeapDes
9ff0: 74 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d  troy (%d), heap=
a000: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a010: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
a020: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
a030: 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  *)pWinMemData->h
a040: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Heap);.      }. 
a050: 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61       pWinMemData
a060: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
a070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
a080: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
a090: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
a0a0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
a0b0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
a0c0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e  y allocation fun
a0d0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69  ction pointers i
a0e0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62  n.** sqlite3Glob
a0f0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20  alConfig.m with 
a100: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
a110: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73  routines in this
a120: 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72   file. The.** ar
a130: 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20  guments specify 
a140: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  the block of mem
a150: 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a  ory to manage..*
a160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a170: 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
a180: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   by sqlite3_conf
a190: 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66  ig(), and theref
a1a0: 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  ore.** is not re
a1b0: 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72  quired to be thr
a1c0: 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e  eadsafe (it is n
a1d0: 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ot)..*/.const sq
a1e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
a1f0: 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  s *sqlite3MemGet
a200: 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73  Win32(void){.  s
a210: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
a220: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
a230: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20  winMemMethods = 
a240: 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c  {.    winMemMall
a250: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72  oc,.    winMemFr
a260: 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65  ee,.    winMemRe
a270: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
a280: 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mSize,.    winMe
a290: 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69  mRoundup,.    wi
a2a0: 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69  nMemInit,.    wi
a2b0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20  nMemShutdown,.  
a2c0: 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a    &win_mem_data.
a2d0: 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77    };.  return &w
a2e0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a  inMemMethods;.}.
a2f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
a300: 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29  SetDefault(void)
a310: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  {.  sqlite3_conf
a320: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
a330: 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33  _MALLOC, sqlite3
a340: 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a  MemGetWin32());.
a350: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a360: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
a370: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
a380: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
a390: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
a3a0: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e  icode (UTF-16?).
a3b0: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f   .**.** Space to
a3c0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
a3d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
a3e0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
a3f0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
a400: 53 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  STR utf8ToUnicod
a410: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
a420: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
a430: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
a440: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
a450: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
a460: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a470: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
a480: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
a490: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
a4a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a4b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
a4c0: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
a4d0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
a4e0: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
a4f0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
a500: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
a510: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
a520: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
a530: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
a540: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
a550: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
a560: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
a570: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
a5a0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
a5b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a5c0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
a5d0: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
a5e0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
a5f0: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
a600: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
a610: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
a620: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e  nicode to UTF-8.
a630: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
a640: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
a650: 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ing is.** obtain
a660: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
a670: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
a680: 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64  tic char *unicod
a690: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
a6a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
a6b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
a6c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
a6d0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
a6e0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
a6f0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
a700: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a710: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
a720: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
a730: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a740: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
a750: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
a760: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
a770: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
a780: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a790: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
a7a0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a7b0: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
a7c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
a7d0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  -1, zFilename, n
a7e0: 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
a810: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
a820: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a830: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a840: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
a850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
a860: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
a870: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53  * Convert an ANS
a880: 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  I string to Micr
a890: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62  osoft Unicode, b
a8a0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
a8b0: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
a8c0: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
a8d0: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
a8e0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
a8f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
a900: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
a910: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
a920: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
a930: 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63  PWSTR mbcsToUnic
a940: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
a950: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
a960: 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54  t nByte;.  LPWST
a970: 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  R zMbcsFilename;
a980: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
a990: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
a9a0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a9b0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
a9c0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
a9d0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
a9e0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
a9f0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20  me, -1, NULL,.  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
aa20: 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a  *sizeof(WCHAR);.
aa30: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
aa40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
aa50: 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e    }.  zMbcsFilen
aa60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
aa70: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
aa80: 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e  izeof(zMbcsFilen
aa90: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
aaa0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d   zMbcsFilename==
aab0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
aac0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
aad0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
aae0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
aaf0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
ab00: 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  1, zMbcsFilename
ab10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20    nByte);.  if( 
ab40: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
ab50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62  sqlite3_free(zMb
ab60: 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  csFilename);.   
ab70: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
ab80: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ab90: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
aba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
abb0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
abc0: 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65  de to multi-byte
abd0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
abe0: 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  g, based on the.
abf0: 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63  ** user's ANSI c
ac00: 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  odepage..**.** S
ac10: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
ac20: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
ac30: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
ac40: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
ac50: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
ac60: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
ac70: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
ac80: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
ac90: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
aca0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
acb0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
acc0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
acd0: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
ace0: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
acf0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
ad00: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
ad10: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
ad20: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
ad30: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
ad40: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
ad50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
ad60: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
ad70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
ad80: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
ad90: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
ada0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
adb0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
adc0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
add0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
ade0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
adf0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
ae20: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
ae30: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
ae40: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
ae50: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
ae60: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
ae70: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
ae80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ae90: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
aea0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
aeb0: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
aec0: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
aed0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
aee0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
aef0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
af00: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
af10: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
af20: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
af30: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
af40: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
af50: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
af60: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
af70: 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f  de = mbcsToUnico
af80: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
af90: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
afa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
afb0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
afc0: 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54  eUtf8 = unicodeT
afd0: 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b  oUtf8(zTmpWide);
afe0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
aff0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
b000: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  urn zFilenameUtf
b010: 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  8;.}../*.** Conv
b020: 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c  ert UTF-8 to mul
b030: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
b040: 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20   string.  Space 
b050: 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20  to hold the .** 
b060: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
b070: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
b080: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
b090: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  )..*/.char *sqli
b0a0: 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
b0b0: 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  o_mbcs(const cha
b0c0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
b0d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
b0e0: 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Mbcs;.  LPWSTR z
b0f0: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
b100: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
b110: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
b120: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
b130: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b140: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
b150: 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64  ameMbcs = unicod
b160: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
b170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
b180: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
b190: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
b1a0: 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  bcs;.}../*.** Th
b1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
b1c0: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
b1d0: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
b1e0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
b1f0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
b200: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
b210: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
b220: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
b230: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
b240: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
b250: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
b260: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
b270: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
b280: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
b290: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
b2a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
b2b0: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
b2c0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
b2d0: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
b2e0: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
b2f0: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
b300: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
b310: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
b320: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
b330: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
b340: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
b350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b360: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
b370: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b380: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
b390: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b3a0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
b3b0: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
b3c0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
b3d0: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
b3e0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
b3f0: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
b400: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
b410: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
b420: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
b430: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
b440: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
b450: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
b460: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
b470: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
b480: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
b490: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
b4a0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
b4b0: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
b4c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
b4d0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
b4e0: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
b4f0: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
b500: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
b510: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
b520: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
b530: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
b540: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
b550: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
b560: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
b570: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
b580: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
b590: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
b5a0: 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20  Utf8(zValue);.  
b5b0: 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55      if ( zValueU
b5c0: 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tf8==0 ){.      
b5d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b5e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
b5f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b600: 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f  _free(*ppDirecto
b610: 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65  ry);.    *ppDire
b620: 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74  ctory = zValueUt
b630: 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  f8;.    return S
b640: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
b650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
b660: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ROR;.}../*.** Th
b670: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
b680: 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  f getLastErrorMs
b690: 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  g.** is zero if 
b6a0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
b6b0: 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
b6c0: 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
b6d0: 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
b6e0: 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
b6f0: 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  as truncated)..*
b700: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b710: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
b720: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
b730: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
b740: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
b750: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
b760: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
b770: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
b780: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
b790: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
b7a0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
b7b0: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
b7c0: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
b7d0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
b7e0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
b7f0: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
b800: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
b810: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
b820: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
b830: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
b840: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
b850: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
b860: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
b870: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
b880: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
b890: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
b8a0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
b8d0: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
b8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
b900: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
b970: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
b9a0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
b9d0: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
b9e0: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
b9f0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
ba00: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
ba10: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
ba20: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
ba30: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
ba50: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
ba60: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba80: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
ba90: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
baa0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
baf0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 30 2c 0a 20 20 20 20 20 20 20 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: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
bb40: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
bb90: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
bba0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
bbb0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
bbc0: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
bbd0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
bbe0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
bbf0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
bc00: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
bc10: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
bc20: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
bc30: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66  ignMalloc();.#if
bc40: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bc50: 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  T.      /* free 
bc60: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
bc70: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
bc80: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
bc90: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
bca0: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65  e(zTempWide);.#e
bcb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ndif.    }.  }.#
bcc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
bcd0: 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
bce0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
bcf0: 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  emp = NULL;.    
bd00: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
bd10: 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f  MessageA(FORMAT_
bd20: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
bd30: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
bd60: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
bd70: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
bda0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
bdd0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20          (LPSTR) 
be40: 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  &zTemp,.        
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
be90: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
bea0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
beb0: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
bec0: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
bed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
bee0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
bef0: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73  ;.      zOut = s
bf00: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
bf10: 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
bf20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
bf30: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
bf40: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
bf50: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
bf60: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
bf70: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
bf80: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
bf90: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a  e(zTemp);.    }.
bfa0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
bfb0: 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20   0 == dwLen ){. 
bfc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
bfd0: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
bfe0: 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28  "OsError 0x%lx (
bff0: 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %lu)", lastErrno
c000: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
c010: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
c020: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
c030: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
c040: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
c050: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c060: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
c070: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
c080: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
c090: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
c0a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
c0b0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
c0c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
c0d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
c0e0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
c0f0: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
c100: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
c110: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
c120: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
c130: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c140: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
c150: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
c160: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
c170: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
c180: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
c190: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
c1a0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
c1b0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
c1c0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
c1d0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
c1e0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
c1f0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
c200: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
c210: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
c220: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
c230: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
c240: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
c250: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
c260: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
c270: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
c280: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
c290: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
c2a0: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
c2b0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
c2c0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
c2d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c2e0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
c2f0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
c300: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
c310: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
c320: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
c330: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
c340: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
c350: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
c360: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
c370: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
c380: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
c390: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3b0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
c3c0: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
c3d0: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
c3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
c3f0: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
c400: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
c410: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
c420: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
c430: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
c440: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
c450: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
c460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
c470: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
c480: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
c490: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
c4c0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
c4d0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
c4e0: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
c4f0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
c500: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
c510: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
c520: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c550: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
c560: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c  g[0] = 0;.  getL
c570: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
c580: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
c590: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
c5a0: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
c5b0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
c5c0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
c5d0: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
c5e0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
c5f0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
c600: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
c610: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
c620: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
c630: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
c640: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
c650: 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25  (%lu) %s(%s) - %
c660: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
c670: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
c680: 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
c690: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
c6a0: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
c6b0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
c6c0: 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
c6d0: 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
c6e0: 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
c6f0: 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
c700: 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
c710: 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
c720: 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
c730: 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76  sed by .** antiv
c740: 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20  irus software.  
c750: 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c  Also the initial
c760: 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68   delay before th
c770: 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a  e first retry..*
c780: 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72  * The delay incr
c790: 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77  eases linearly w
c7a0: 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a  ith each retry..
c7b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c7c0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c7d0: 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  TRY.# define SQL
c7e0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c7f0: 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a  RETRY 10.#endif.
c800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
c810: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
c820: 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20  _DELAY.# define 
c830: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
c840: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32  RR_RETRY_DELAY 2
c850: 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  5.#endif.static 
c860: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
c870: 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  try = SQLITE_WIN
c880: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a  32_IOERR_RETRY;.
c890: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
c8a0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
c8b0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
c8c0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
c8d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  ;../*.** If a Re
c8e0: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
c8f0: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
c900: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
c910: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
c920: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
c930: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
c940: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
c950: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
c960: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
c970: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
c980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74  /.static int ret
c990: 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
c9a0: 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
c9b0: 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
c9c0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
c9d0: 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
c9e0: 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65  ry>=win32IoerrRe
c9f0: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
ca00: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
ca10: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
ca20: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
ca30: 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52    }.  if( e==ERR
ca40: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
ca50: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
ca60: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
ca70: 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  N ||.      e==ER
ca80: 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
ca90: 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ATION ){.    sql
caa0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
cab0: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
cac0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
cad0: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
cae0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
caf0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
cb00: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
cb10: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
cb20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cb30: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
cb40: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
cb50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
cb60: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
cb70: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
cb80: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
cb90: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
cba0: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
cbb0: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
cbc0: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
cbd0: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
cbe0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
cbf0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
cc00: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
cc10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
cc20: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
cc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
cc70: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
cc80: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
cc90: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
cca0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ccb0: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
ccc0: 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
ccd0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
cce0: 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65  ME_API./*.** The
ccf0: 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e   MSVC CRT on Win
cd00: 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20  dows CE may not 
cd10: 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
cd20: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
cd30: 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62  .** create a sub
cd40: 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
cd50: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
cd60: 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
cd70: 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
cd80: 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
cd90: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
cda0: 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
cdb0: 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
cdc0: 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
cdd0: 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
cde0: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
cdf0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
ce00: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
ce10: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
ce20: 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
ce30: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
ce40: 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
ce50: 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
ce60: 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
ce70: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
ce80: 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
ce90: 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
cea0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
ceb0: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
cec0: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
ced0: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
cee0: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
cef0: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
cf00: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
cf10: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
cf20: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
cf30: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
cf40: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
cf50: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
cf60: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
cf70: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
cf80: 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
cf90: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
cfa0: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
cfb0: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
cfc0: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
cfd0: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
cfe0: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
cff0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
d000: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
d010: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
d020: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
d030: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
d040: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
d050: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
d060: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
d070: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
d080: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
d090: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
d0a0: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
d0b0: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
d0c0: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
d0d0: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
d0e0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
d0f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
d100: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
d110: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
d120: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
d130: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
d140: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
d150: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
d160: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
d170: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
d180: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
d190: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
d1a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
d1b0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
d1c0: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
d1d0: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
d1e0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
d1f0: 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
d200: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
d210: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
d220: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38  ..  zName = utf8
d230: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
d240: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
d250: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
d260: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
d270: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d280: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
d290: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
d2a0: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
d2b0: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
d2c0: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
d2d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
d2e0: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
d2f0: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
d300: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
d310: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
d320: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
d330: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
d340: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
d350: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
d360: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
d370: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
d380: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
d390: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
d3a0: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
d3b0: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
d3c0: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
d3d0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
d3e0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
d3f0: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
d400: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
d410: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
d420: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d430: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d440: 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  r();.    winLogE
d450: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
d460: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
d470: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d480: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
d490: 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
d4a0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
d4b0: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
d4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4d0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  IOERR;.  }..  /*
d4e0: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
d4f0: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
d500: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
d510: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
d520: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20  e->hMutex);.  . 
d530: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61   /* Since the na
d540: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74  mes of named mut
d550: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73  exes, semaphores
d560: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20  , file mappings 
d570: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61  etc are .  ** ca
d580: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
d590: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
d5a0: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
d5b0: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
d5c0: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
d5d0: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
d5e0: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
d5f0: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73   name..  */.  os
d600: 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65  CharUpperW(zName
d610: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61  );.  pFile->hSha
d620: 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69  red = osCreateFi
d630: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
d640: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
d650: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
d680: 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
d690: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
d6a0: 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
d6d0: 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74  me);  ..  /* Set
d6e0: 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
d6f0: 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65  icates we're the
d700: 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65   first to create
d710: 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69   the memory so i
d720: 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  t .  ** must be 
d730: 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64  zero-initialized
d740: 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20   */.  lastErrno 
d750: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
d760: 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72  ();.  if (lastEr
d770: 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52  rno == ERROR_ALR
d780: 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20  EADY_EXISTS){.  
d790: 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b    bInit = FALSE;
d7a0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
d7b0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  free(zName);..  
d7c0: 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64  /* If we succeed
d7d0: 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65  ed in making the
d7e0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
d7f0: 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a  andle, map it. *
d800: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
d810: 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46  Shared ){.    pF
d820: 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77  ile->shared = (w
d830: 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56  inceLock*)osMapV
d840: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
d850: 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20  >hShared, .     
d860: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
d870: 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
d880: 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
d890: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
d8a0: 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
d8b0: 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
d8c0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
d8d0: 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
d8e0: 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
d8f0: 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
d900: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d910: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
d920: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
d930: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
d940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
d950: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
d980: 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
d990: 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
d9a0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
d9b0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
d9c0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
d9d0: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
d9e0: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
d9f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
da00: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
da10: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
da20: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
da30: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
da40: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
da50: 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
da60: 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
da70: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
da80: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
da90: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
daa0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
dab0: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
dac0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
dae0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
daf0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
db00: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
db10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
db20: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
db30: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
db40: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
db50: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
db60: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
db70: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
db80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
db90: 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  R;.  }.  .  /* I
dba0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
dbb0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
dbc0: 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
dbd0: 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
dbe0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
dbf0: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
dc00: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
dc10: 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
dc20: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
dc30: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
dc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
dc60: 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
dc70: 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
dc80: 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
dc90: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
dca0: 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
dcb0: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
dcc0: 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
dcd0: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
dce0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
dcf0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
dd00: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
dd10: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
dd20: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
dd30: 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
dd40: 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
dd50: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
dd60: 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
dd70: 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
dd80: 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
dd90: 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
dda0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
ddb0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
ddc0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
ddd0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
dde0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
ddf0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
de00: 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
de10: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
de20: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
de30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
de40: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
de50: 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
de60: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
de70: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
de80: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
de90: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
dea0: 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
deb0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
dec0: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
ded0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
dee0: 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
def0: 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
df00: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
df10: 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
df20: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
df30: 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
df40: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
df50: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
df60: 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
df70: 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
df80: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
df90: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
dfa0: 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20  >hMutex);    .  
dfb0: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
dfc0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
dfd0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
dfe0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
dff0: 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ./* .** An imple
e000: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
e010: 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20   LockFile() API 
e020: 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
e030: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
e040: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a   winceLockFile(.
e050: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
e060: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
e070: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
e080: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
e090: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
e0a0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e0b0: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
e0c0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
e0d0: 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
e0e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
e0f0: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
e100: 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
e110: 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
e120: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
e130: 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
e140: 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
e150: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
e160: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
e170: 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
e180: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
e190: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
e1a0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
e1b0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
e1c0: 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65   /* Wanting an e
e1d0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
e1e0: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
e1f0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
e200: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20  D)SHARED_FIRST. 
e210: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
e220: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
e230: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e240: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
e250: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
e260: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
e270: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e280: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
e290: 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
e2a0: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
e2b0: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
e2c0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e2d0: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
e2e0: 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
e2f0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e300: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
e310: 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
e320: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e330: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e340: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
e350: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
e360: 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
e370: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
e380: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
e390: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
e3a0: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
e3b0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
e3c0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
e3d0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e3e0: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29  l.nReaders == 1)
e3f0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
e400: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
e410: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s ++;.      }.  
e420: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
e430: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
e440: 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69   /* Want a pendi
e450: 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ng lock? */.  el
e460: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
e470: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e480: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20  )PENDING_BYTE.  
e490: 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
e4a0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e4b0: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
e4c0: 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
e4d0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
e4e0: 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
e4f0: 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
e500: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
e510: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
e520: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
e530: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
e540: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
e550: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
e560: 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
e570: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e580: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e590: 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
e5a0: 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
e5b0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
e5c0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e5d0: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
e5e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
e5f0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
e600: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
e610: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
e620: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
e630: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
e640: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
e650: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
e660: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e670: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
e680: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e690: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e6a0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
e6b0: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
e6c0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
e6d0: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
e6e0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
e6f0: 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
e700: 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
e710: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
e720: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
e730: 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
e740: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
e750: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
e760: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
e770: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
e780: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
e790: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e7a0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
e7b0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e7c0: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
e7d0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
e7e0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
e7f0: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
e800: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
e810: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e820: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
e830: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
e840: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
e850: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
e860: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
e870: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
e880: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
e890: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
e8a0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
e8b0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
e8c0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
e8d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e8e0: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
e8f0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
e900: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
e910: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
e920: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
e930: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
e940: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e950: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
e960: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
e970: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e980: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e990: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
e9a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e9b0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
e9c0: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
e9d0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
e9e0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
e9f0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
ea00: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
ea10: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
ea20: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
ea30: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
ea40: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
ea50: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
ea60: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
ea70: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
ea80: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
ea90: 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  D_SIZE.         
eaa0: 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66      || nNumberOf
eab0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
eac0: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
ead0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
eae0: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
eaf0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
eb00: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
eb10: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
eb20: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
eb30: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
eb40: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
eb50: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
eb60: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
eb70: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
eb80: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
eb90: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
eba0: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
ebb0: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
ebc0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
ebd0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
ebe0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
ebf0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
ec00: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
ec10: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
ec20: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
ec30: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
ec40: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
ec50: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
ec60: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
ec70: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
ec80: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
ec90: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
eca0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
ecb0: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
ecc0: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
ecd0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
ece0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
ecf0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
ed00: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
ed10: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
ed20: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
ed30: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
ed40: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
ed50: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
ed60: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
ed70: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
ed80: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
ed90: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
eda0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
edb0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  rn bReturn;.}./*
edc0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
edd0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
ede0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
edf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee30: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
ee40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
ee50: 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20  /../*.** Lock a 
ee60: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a  file region..*/.
ee70: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c  static BOOL winL
ee80: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
ee90: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
eea0: 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f  ORD flags,.  DWO
eeb0: 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
eec0: 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
eed0: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
eee0: 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
eef0: 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
ef00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ef10: 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
ef20: 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
ef30: 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
ef40: 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
ef50: 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
ef60: 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
ef70: 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a  PI LockFile..  *
ef80: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
ef90: 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  LockFile(phFile,
efa0: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
efb0: 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
efd0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
efe0: 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
eff0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
f000: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
f010: 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
f020: 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
f030: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
f040: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
f050: 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
f060: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
f070: 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
f080: 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
f090: 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
f0a0: 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74  flags, 0, numByt
f0b0: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
f0c0: 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
f0d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
f0e0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46   osLockFile(*phF
f0f0: 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
f100: 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
f110: 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
f130: 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20  umBytesHigh);.  
f140: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
f150: 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  * Unlock a file 
f160: 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74  region.. */.stat
f170: 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63  ic BOOL winUnloc
f180: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
f190: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
f1a0: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
f1b0: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
f1c0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
f1d0: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
f1e0: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
f1f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
f200: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
f210: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
f220: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
f230: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
f240: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
f250: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
f260: 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20  I UnlockFile..  
f270: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
f280: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69  eUnlockFile(phFi
f290: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
f2a0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
f2d0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
f2e0: 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54  #else.  if( isNT
f2f0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
f300: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
f310: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
f320: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
f330: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
f340: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
f350: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
f360: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
f370: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
f380: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
f390: 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
f3a0: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
f3b0: 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
f3c0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
f3d0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
f3e0: 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
f3f0: 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
f400: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
f430: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f440: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f490: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
f4a0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
f4b0: 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
f4c0: 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
f4d0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
f4e0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
f4f0: 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
f550: 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
f560: 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
f570: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
f580: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
f590: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
f5a0: 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
f5b0: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
f5c0: 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
f5d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
f5e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
f5f0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
f600: 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
f610: 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
f620: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66   argument to off
f630: 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68  set iOffset with
f640: 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  in the file. If 
f650: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
f660: 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rn 0. .** Otherw
f670: 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e  ise, set pFile->
f680: 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65  lastErrno and re
f690: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
f6a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
f6b0: 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65  kWinFile(winFile
f6c0: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
f6d0: 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b  _int64 iOffset){
f6e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
f6f0: 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70  WINRT.  LONG upp
f700: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
f710: 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
f720: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
f730: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f740: 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20  LONG lowerBits; 
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32  /* Least sig. 32
f770: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
f780: 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  set */.  DWORD d
f790: 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wRet;           
f7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f7b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
f7c0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a  tFilePointer() *
f7d0: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
f7e0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
f7f0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
f800: 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
f810: 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53  Error() */..  OS
f820: 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
f830: 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
f840: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
f850: 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70  iOffset));..  up
f860: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
f870: 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
f880: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
f890: 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
f8a0: 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
f8b0: 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
f8c0: 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
f8d0: 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
f8e0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
f8f0: 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a  rns a dword .  *
f900: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
f910: 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
f920: 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
f930: 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
f940: 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
f950: 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
f960: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f970: 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
f980: 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20  ing to MSDN, .  
f990: 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
f9a0: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
f9b0: 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
f9c0: 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
f9d0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
f9e0: 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
f9f0: 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
fa00: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20  occurred, it is 
fa10: 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
fa20: 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74  o call .  ** Get
fa30: 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
fa40: 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
fa50: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
fa60: 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
fa70: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
fa80: 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
fa90: 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
faa0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
fab0: 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
fac0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
fad0: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
fae0: 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
faf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fb00: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
fb10: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fb20: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
fb30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fb40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
fb50: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
fb60: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
fb70: 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
fb80: 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
fb90: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
fba0: 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
fbb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
fbc0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
fbd0: 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
fbe0: 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
fbf0: 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
fc00: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
fc10: 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
fc20: 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
fc30: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
fc40: 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
fc50: 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
fc60: 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fc80: 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
fc90: 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
fcc0: 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
fcd0: 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
fce0: 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
fcf0: 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
fd00: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
fd10: 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
fd20: 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
fd30: 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
fd40: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fd50: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fd60: 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
fd70: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fd80: 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
fd90: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
fda0: 20 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69           "seekWi
fdb0: 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  nFile", pFile->z
fdc0: 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
fdd0: 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
fde0: 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
fdf0: 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
fe00: 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
fe10: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
fe20: 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
fe30: 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
fe40: 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
fe50: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
fe60: 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
fe70: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
fe80: 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >0./* Forward re
fe90: 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
fea0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
feb0: 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
fec0: 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65  le(winFile*);.#e
fed0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
fee0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
fef0: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
ff00: 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
ff10: 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
ff20: 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
ff30: 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
ff40: 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
ff50: 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
ff60: 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut Windows is no
ff70: 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
ff80: 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
ff90: 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
ffa0: 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
ffb0: 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
ffc0: 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
ffd0: 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
ffe0: 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
fff0: 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
10000 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
10010 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
10020 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
10030 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
10040 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
10050 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
10060 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
10070 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
10080 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
10090 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
100a0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
100b0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  *id){.  int rc, 
100c0 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  cnt = 0;.  winFi
100d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
100e0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
100f0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69  ert( id!=0 );.#i
10100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10110 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
10120 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29  pFile->pShm==0 )
10130 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
10140 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c  t( pFile->h!=NUL
10150 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49  L && pFile->h!=I
10160 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
10170 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  LUE );.  OSTRACE
10180 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70  (("CLOSE file=%p
10190 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
101a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
101b0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 72  _MMAP_SIZE>0.  r
101c0 63 20 3d 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  c = winUnmapfile
101d0 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
101e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
101f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
10200 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
10210 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
10220 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
10230 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10240 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
10250 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
10260 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
10270 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
10280 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
10290 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
102a0 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
102b0 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
102c0 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
102d0 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
102e0 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
102f0 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
10300 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
10310 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
10320 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
10330 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
10340 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
10350 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
10360 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
10370 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
10380 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
10390 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
103a0 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
103b0 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26  fffff .        &
103c0 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
103d0 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
103e0 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
103f0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
10400 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
10410 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
10420 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
10430 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
10440 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10450 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
10460 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
10470 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
10480 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  le->h = NULL;.  
10490 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
104a0 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  -1);.  OSTRACE((
104b0 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c 20  "CLOSE file=%p, 
104c0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
104d0 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
104e0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
104f0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
10500 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
10510 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
10520 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
10530 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
10540 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10560 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
10570 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
10580 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
10590 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
105a0 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
105b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
105c0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
105d0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
105e0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
105f0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
10600 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
10610 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
10620 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
10630 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
10640 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
10650 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
10660 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
10670 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
10680 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
10690 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
106a0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
106b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
106c0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
106d0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
106e0 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
106f0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
10700 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
10710 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
10720 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f  ITE_OS_WINCE.  O
10730 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
10740 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  pped;          /
10750 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
10760 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65   ReadFile. */.#e
10770 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
10780 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
10790 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
107a0 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
107b0 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
107c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
107d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
107e0 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
107f0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
10800 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
10810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10820 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
10830 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
10840 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10850 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
10860 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
10870 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
10880 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
10890 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
108a0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
108b0 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70  le=%p, buffer=%p
108c0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66  , amount=%d, off
108d0 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  set=%lld, lock=%
108e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
108f0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c   pFile->h, pBuf,
10900 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46   amt, offset, pF
10910 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
10920 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
10930 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
10940 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d  * Deal with as m
10950 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64  uch of this read
10960 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
10970 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
10980 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
10990 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
109a0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
109b0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
109c0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
109d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
109e0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
109f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
10a00 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
10a10 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
10a20 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
10a30 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29  ))[offset], amt)
10a40 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
10a50 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c 65  ("READ-MMAP file
10a60 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
10a70 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
10a80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
10a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
10aa0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
10ab0 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
10ac0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
10ad0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
10ae0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
10af0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
10b00 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
10b10 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
10b20 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
10b30 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
10b40 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
10b50 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
10b60 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
10b70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
10b80 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
10b90 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
10ba0 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
10bb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
10bc0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
10bd0 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
10be0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
10bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
10c00 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
10c10 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
10c20 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
10c30 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
10c40 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
10c50 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
10c60 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
10c70 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
10c80 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
10c90 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
10ca0 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
10cb0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
10cc0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
10cd0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
10ce0 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
10cf0 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
10d00 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
10d10 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
10d20 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
10d30 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
10d40 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
10d50 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
10d60 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10d70 0a 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f  .    if( retryIo
10d80 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10d90 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10da0 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
10db0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
10dc0 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  Errno;.    OSTRA
10dd0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
10de0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
10df0 52 52 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RR_READ\n", pFil
10e00 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
10e10 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
10e20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
10e30 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
10e40 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
10e50 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c   "winRead", pFil
10e60 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
10e70 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79   logIoerr(nRetry
10e80 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28  );.  if( nRead<(
10e90 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
10ea0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
10eb0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
10ec0 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
10ed0 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
10ee0 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
10ef0 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e  nRead], 0, amt-n
10f00 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41  Read);.    OSTRA
10f10 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
10f20 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
10f30 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22  RR_SHORT_READ\n"
10f40 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
10f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10f60 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
10f70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
10f80 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
10f90 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
10fa0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
10fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
10fd0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
10fe0 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
10ff0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
11000 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
11010 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
11020 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
11030 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
11040 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
11050 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11070 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
11080 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
11090 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
110a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
110b0 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
110c0 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
110d0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
110f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
11100 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
11110 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
11120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11130 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
11140 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
11150 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
11160 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
11190 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65   has occurred, e
111a0 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77  lse false */.  w
111b0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
111c0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
111d0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * File handle */
111e0 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
111f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11200 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11210 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73  retries */..  as
11220 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
11230 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11240 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
11250 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
11260 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a  E_IOERR_WRITE);.
11270 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
11280 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
11290 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20  QLITE_FULL);..  
112a0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
112b0 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
112c0 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f  %p, amount=%d, o
112d0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
112e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
112f0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
11300 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
11310 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
11320 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
11330 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
11340 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
11350 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
11360 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
11370 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
11380 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
11390 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
113a0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
113b0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
113c0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
113d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
113e0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
113f0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
11400 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
11410 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
11420 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
11430 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
11440 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
11450 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20  CE(("WRITE-MMAP 
11460 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11470 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
11480 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
11490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
114a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
114b0 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
114c0 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
114d0 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
114e0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
114f0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
11500 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
11510 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
11520 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
11530 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
11540 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
11550 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
11560 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
11570 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
11580 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11590 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46  .  rc = seekWinF
115a0 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
115b0 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  t);.  if( rc==0 
115c0 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e  ){.#else.  {.#en
115d0 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
115e0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45  OS_WINCE.    OVE
115f0 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
11600 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed;        /* Th
11610 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69  e offset for Wri
11620 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  teFile. */.#endi
11630 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  f.    u8 *aRem =
11640 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
11650 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
11660 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
11670 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
11680 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
11690 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
116a0 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
116b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
116c0 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116e0 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
116f0 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
11700 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
11710 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
11720 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
11730 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
11740 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
11750 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
11760 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d  OS_WINCE.    mem
11770 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
11780 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
11790 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65  APPED));.    ove
117a0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
117b0 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
117c0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
117d0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
117e0 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
117f0 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
11800 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
11810 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  dif..    while( 
11820 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51  nRem>0 ){.#if SQ
11830 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11840 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
11850 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
11860 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
11870 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
11880 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
11890 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
118a0 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
118b0 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
118c0 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
118d0 20 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f       if( retryIo
118e0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
118f0 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
11900 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
11910 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11920 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
11930 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
11940 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
11950 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
11960 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
11970 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
11980 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
11990 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
119a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
119b0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
119c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
119d0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
119e0 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
119f0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
11a00 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
11a10 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
11a20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
11a30 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
11a40 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
11a50 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
11a60 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
11a70 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
11a80 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
11a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
11aa0 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
11ab0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11ac0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
11ad0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
11ae0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
11af0 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
11b00 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
11b10 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
11b20 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
11b30 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
11b40 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
11b50 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
11b60 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
11b70 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11b80 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c  TE_FULL\n", pFil
11b90 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
11ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
11bc0 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
11bd0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
11be0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
11bf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11c00 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
11c10 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
11c20 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
11c30 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11c40 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c       "winWrite",
11c50 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67    }else{.    log
11c70 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
11c80 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57   }.  OSTRACE(("W
11c90 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
11ca0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
11cb0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
11cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11cd0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
11ce0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
11cf0 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
11d00 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
11d10 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
11d20 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
11d30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
11d40 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
11d50 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11d60 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
11d70 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
11d80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11d90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
11da0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11db0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
11dc0 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  n */.  DWORD las
11dd0 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
11de0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
11df0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
11e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11e10 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f  R_TRUNCATE);.  O
11e20 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
11e30 45 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d  E file=%p, size=
11e40 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
11e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
11e60 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46  le->h, nByte, pF
11e70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
11e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
11e90 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
11ea0 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
11eb0 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
11ec0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
11ed0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
11ee0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
11ef0 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
11f00 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
11f10 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
11f20 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
11f30 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
11f40 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
11f50 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
11f60 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
11f70 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
11f80 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
11f90 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
11fa0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
11fb0 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
11fc0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
11fd0 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nk;.  }..  /* Se
11fe0 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74  tEndOfFile() ret
11ff0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  urns non-zero wh
12000 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  en successful, o
12010 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66  r zero when it f
12020 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73  ails. */.  if( s
12030 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
12040 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
12050 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
12060 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
12070 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
12080 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
120a0 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
120b0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
120c0 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
120d0 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
120e0 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20  e->h) &&.       
120f0 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f       ((lastErrno
12100 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12110 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52  r())!=ERROR_USER
12120 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b  _MAPPED_FILE) ){
12130 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
12140 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
12150 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  o;.    rc = winL
12160 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12170 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
12180 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
12190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
121a0 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
121b0 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
121c0 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  th);.  }..#if SQ
121d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
121e0 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65  ZE>0.  /* If the
121f0 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61   file was trunca
12200 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
12210 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
12220 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61  urrently.  ** ma
12230 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64  pped region, red
12240 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
12250 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61  e mapping size a
12260 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77  s well. SQLite w
12270 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61  ill.  ** use rea
12280 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
12290 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
122a0 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
122b0 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20   from now on..  
122c0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
122d0 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42  pMapRegion && nB
122e0 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
122f0 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ize ){.    pFile
12300 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79  ->mmapSize = nBy
12310 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  te;.  }.#endif..
12320 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
12330 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  CATE file=%p, rc
12340 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
12350 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
12360 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
12370 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
12380 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
12390 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
123a0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
123b0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
123c0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
123d0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
123e0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
123f0 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
12400 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
12410 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
12420 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
12430 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
12440 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
12450 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
12460 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
12470 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
12480 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
12490 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
124a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
124b0 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
124c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
124d0 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
124e0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
124f0 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
12500 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
12510 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
12520 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
12530 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
12540 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
12550 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
12560 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
12570 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
12580 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
12590 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
125a0 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a  EBUG)).  /*.  **
125b0 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
125c0 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
125d0 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
125e0 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
125f0 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
12600 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
12610 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12620 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12630 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
12640 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
12650 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12660 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
12670 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
12680 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
12690 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
126a0 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
126b0 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
126c0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
126d0 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
126e0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
126f0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
12700 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
12710 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
12720 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
12730 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
12740 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
12750 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
12760 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
12770 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
12780 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
12790 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
127a0 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
127b0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
127c0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
127d0 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67  NC file=%p, flag
127e0 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  s=%x, lock=%d\n"
127f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
12800 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46  le->h, flags, pF
12810 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
12820 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12830 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
12840 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
12850 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
12860 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
12870 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
12880 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
12890 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
128a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
128b0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
128c0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
128d0 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
128e0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
128f0 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
12900 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
12910 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12920 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74  TE_NO_SYNC.  ret
12930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
12940 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
12950 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
12960 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
12970 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
12980 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
12990 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
129a0 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
129b0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
129c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
129d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
129e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
129f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12a00 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
12a10 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
12a20 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
12a30 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12a40 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
12a50 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12a60 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
12a70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
12a80 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
12a90 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
12aa0 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69    "winSync", pFi
12ab0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
12ac0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12ad0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
12ae0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
12af0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
12b00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
12b10 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
12b20 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
12b30 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
12b40 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12b50 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12b60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12b70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
12b80 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
12b90 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
12ba0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
12bb0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
12bc0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
12bd0 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
12be0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
12bf0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
12c00 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
12c10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
12c20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
12c30 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
12c40 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
12c50 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
12c60 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
12c70 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
12c80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
12cb0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
12cc0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
12cd0 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
12ce0 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
12cf0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
12d00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12d10 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12d20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
12d30 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12d40 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
12d50 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
12d80 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12d90 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
12da0 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
12db0 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
12dc0 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
12dd0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
12de0 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
12df0 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
12e00 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
12e10 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
12e20 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
12e30 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
12e40 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
12e50 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
12e60 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
12e70 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
12e80 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
12e90 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
12ea0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
12eb0 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
12ec0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12ed0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
12ee0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
12ef0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
12f00 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
12f10 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12f20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
12f30 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
12f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
12f50 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
12f60 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
12f70 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25  ize=%p, *pSize=%
12f80 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  lld, rc=%s\n",. 
12f90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12fa0 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a  >h, pSize, *pSiz
12fb0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
12fc0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
12fd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
12fe0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
12ff0 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
13000 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
13010 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
13020 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
13030 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
13040 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
13050 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
13060 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
13070 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
13080 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
13090 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
130a0 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
130b0 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
130c0 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
130d0 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
130e0 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
130f0 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
13100 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
13110 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
13120 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
13130 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
13140 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
13150 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
13160 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
13170 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
13180 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
13190 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
131a0 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
131b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
131c0 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
131d0 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
131e0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
131f0 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
13200 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
13210 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
13220 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
13230 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
13240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
13250 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
13260 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
13270 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
13280 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
13290 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
132c0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
132d0 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
132e0 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
132f0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
13300 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
13310 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
13320 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
13330 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
13340 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
13350 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
13360 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
13370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
13380 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
13390 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
133a0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
133b0 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
133c0 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
133d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
133e0 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
133f0 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
13400 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
13410 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
13420 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13430 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
13440 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
13450 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
13460 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
13470 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
13480 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
13490 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
134a0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
134b0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
134c0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
134d0 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53   isNT() ){.#if S
134e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
134f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
13500 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
13510 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
13520 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
13530 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
13540 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  n32.    **      
13550 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e   API LockFileEx.
13560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  .    */.    res 
13570 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  = winceLockFile(
13580 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
13590 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
135a0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73  );.#else.    res
135b0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
135c0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
135d0 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
135e0 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
135f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
13600 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
13610 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69  _SIZE, 0);.#endi
13620 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
13630 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
13640 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  SI.  else{.    i
13650 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
13660 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
13670 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
13680 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
13690 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
136a0 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
136b0 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
136c0 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
136d0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
136e0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
136f0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
13700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13710 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
13720 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
13730 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
13740 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
13750 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
13760 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
13770 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13780 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
13790 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
137a0 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
137b0 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54  ock */.  }.  OST
137c0 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b  RACE(("READ-LOCK
137d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
137e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
137f0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73  lite3ErrName(res
13800 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  )));.  return re
13810 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
13820 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
13830 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
13840 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
13850 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
13860 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
13870 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
13880 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
13890 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
138a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
138b0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
138c0 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
138d0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
138e0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
138f0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
13900 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
13910 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
13920 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
13930 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
13940 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
13950 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13960 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
13970 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
13980 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
13990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
139a0 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
139b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
139c0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
139d0 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
139e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
139f0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13a00 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
13a10 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
13a20 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
13a30 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13a40 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
13a50 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
13a60 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f  >zPath);.  }.  O
13a70 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
13a80 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  LOCK file=%p, rc
13a90 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
13aa0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
13ab0 28 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72  (res)));.  retur
13ac0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
13ad0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
13ae0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
13af0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
13b00 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
13b10 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13b20 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13b30 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13b40 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13b50 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13b60 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13b70 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
13b80 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
13b90 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
13ba0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
13bb0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
13bc0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
13bd0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13be0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13bf0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13c00 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13c10 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13c20 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13c30 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
13c40 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13c50 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
13c60 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
13c70 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
13c80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
13c90 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
13ca0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
13cb0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
13cc0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
13cd0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
13ce0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
13cf0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
13d00 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
13d10 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13d20 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
13d30 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
13d40 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
13d50 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13d60 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
13d70 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
13d80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
13d90 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
13da0 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
13db0 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
13dc0 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
13dd0 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
13de0 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
13df0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
13e00 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
13e10 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
13e20 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
13e30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13e40 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
13e50 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
13e60 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
13e70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
13e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13e90 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
13ea0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
13eb0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
13ec0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13ed0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
13ee0 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
13ef0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
13f00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
13f10 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
13f20 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
13f30 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
13f40 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
13f50 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
13f60 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
13f70 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
13f80 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
13f90 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
13fa0 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
13fb0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
13fc0 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
13fd0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
13fe0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
13ff0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
14000 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
14010 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
14020 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
14030 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
14040 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
14050 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
14060 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
14070 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
14080 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
14090 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
140a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
140b0 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
140c0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
140d0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
140e0 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
140f0 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
14100 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
14110 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
14120 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
14130 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
14140 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
14150 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
14160 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
14170 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
14180 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
14190 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65  ("LOCK-HELD file
141a0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
141b0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
141c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
141d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
141e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
141f0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
14200 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
14210 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14220 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
14230 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
14240 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
14250 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
14260 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
14270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
14280 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
14290 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
142a0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
142b0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
142c0 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
142d0 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
142e0 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
142f0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
14300 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
14310 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
14320 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14330 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
14340 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
14350 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
14360 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
14370 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
14380 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65  Locktype = pFile
14390 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
143a0 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  (   (pFile->lock
143b0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20  type==NO_LOCK). 
143c0 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b      || (   (lock
143d0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
143e0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26  LOCK).         &
143f0 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  & (pFile->lockty
14400 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
14410 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  K)).  ){.    int
14420 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
14430 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
14440 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
14450 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
14460 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
14470 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
144a0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
144b0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
144c0 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
144d0 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
144e0 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
144f0 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
14500 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
14510 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
14520 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
14530 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
14540 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
14550 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
14560 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
14570 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
14580 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
14590 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
145a0 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
145b0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
145c0 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
145d0 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
145e0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
145f0 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
14600 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41    */.      OSTRA
14610 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
14620 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
14630 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
14640 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14650 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
14660 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
14670 28 72 65 73 29 29 29 3b 0a 20 20 20 20 20 20 69  (res)));.      i
14680 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33  f( cnt ) sqlite3
14690 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b  _win32_sleep(1);
146a0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
146b0 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
146c0 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
146d0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
146e0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
146f0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
14700 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
14710 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
14720 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14730 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
14740 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
14750 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14760 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
14770 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
14780 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
14790 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
147a0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
147b0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
147c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
147d0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
147e0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
147f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
14800 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
14810 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
14820 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
14830 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
14840 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14850 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
14860 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
14870 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
14880 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
14890 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
148a0 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
148b0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
148c0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
148d0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
148e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
148f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14900 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
14910 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14920 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
14930 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
14940 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
14950 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
14960 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
14970 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
14980 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
14990 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
149a0 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
149b0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
149c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
149d0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
149e0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
149f0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
14a00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
14a10 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
14a20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
14a30 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63   = unlockReadLoc
14a40 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
14a50 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
14a60 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
14a70 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14a80 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
14a90 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
14aa0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
14ab0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
14ac0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
14ad0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
14ae0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
14af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
14b00 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14b10 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14b20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46    getReadLock(pF
14b30 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
14b40 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
14b50 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
14b60 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
14b70 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
14b80 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
14b90 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
14ba0 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
14bb0 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
14bc0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
14bd0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
14be0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14bf0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14c00 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
14c10 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
14c20 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
14c30 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
14c40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
14c50 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
14c60 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
14c70 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
14c80 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
14c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
14cb0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
14cc0 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74  IL file=%p, want
14cd0 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22  ed=%d, got=%d\n"
14ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
14cf0 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
14d00 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
14d10 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
14d20 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
14d30 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  no;.    rc = SQL
14d40 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
14d50 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14d60 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
14d70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
14d80 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
14d90 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
14da0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14db0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
14dc0 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
14dd0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
14de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
14e00 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
14e10 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
14e20 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
14e30 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
14e40 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
14e50 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
14e60 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
14e70 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
14e80 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
14e90 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
14ea0 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
14eb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14ec0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14ed0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
14ee0 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c  int rc;.  winFil
14ef0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
14f00 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
14f10 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
14f20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14f30 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
14f40 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  CK; );.  OSTRACE
14f50 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
14f60 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
14f70 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
14f80 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
14f90 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
14fa0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
14fb0 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
14fc0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
14fd0 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
14fe0 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
14ff0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28  file=%p, rc=%d (
15000 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
15010 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c  ->h, rc));.  }el
15020 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  se{.    rc = win
15030 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15040 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15050 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45  ILEEX_FLAGS,RESE
15060 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
15070 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
15080 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f  ){.      winUnlo
15090 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
150a0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
150b0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
150c0 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
150d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
150e0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
150f0 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65  p, rc=%d (remote
15100 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
15110 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
15120 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54  sOut = rc;.  OST
15130 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15140 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
15150 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
15160 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
15170 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
15180 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
15190 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
151a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
151b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
151c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
151d0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
151e0 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
151f0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
15200 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
15210 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15220 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
15230 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
15240 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
15250 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
15260 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
15270 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
15280 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
15290 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
152a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
152b0 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
152c0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
152d0 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
152e0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
152f0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
15300 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
15310 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
15320 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
15330 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
15340 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
15350 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
15360 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
15370 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
15380 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
15390 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
153a0 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
153b0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
153c0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
153d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
153e0 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
153f0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
15400 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
15410 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15420 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
15430 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
15440 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
15450 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15460 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
15470 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
15480 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
15490 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
154a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
154b0 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
154c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
154d0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
154e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
154f0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
15500 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
15510 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
15520 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
15530 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
15540 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
15550 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
15560 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
15570 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
15580 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
15590 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
155a0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
155b0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
155c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
155d0 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
155e0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
155f0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63         "winUnloc
15600 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
15610 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
15620 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45  f( type>=RESERVE
15630 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
15640 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
15650 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
15660 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
15670 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
15680 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
15690 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
156a0 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
156b0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
156c0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
156d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
156e0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
156f0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
15700 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
15710 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
15720 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
15730 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
15740 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
15750 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
15760 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
15770 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
15780 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
15790 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
157a0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
157b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
157c0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
157d0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
157e0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
157f0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
15800 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
15810 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
15820 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
15830 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
15840 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
15850 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
15860 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
15870 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
15880 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
15890 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
158a0 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
158b0 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
158c0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
158d0 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
158e0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
158f0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
15900 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
15910 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
15920 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
15930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
15940 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
15950 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
15960 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
15970 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
15980 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
15990 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
159a0 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
159b0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
159c0 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 23 69 66  char *zBuf);.#if
159d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
159e0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
159f0 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
15a00 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  nFile*, sqlite3_
15a10 69 6e 74 36 34 29 3b 0a 23 65 6e 64 69 66 0a 0a  int64);.#endif..
15a20 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
15a30 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
15a40 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
15a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15a60 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
15a70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15a80 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
15a90 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
15aa0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
15ab0 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
15ac0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15ad0 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
15ae0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
15af0 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
15b00 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
15b10 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
15b20 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
15b30 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
15b40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15b50 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15b60 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15b70 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15b80 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15ba0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
15bb0 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
15bc0 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
15bd0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
15be0 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  nt)pFile->lastEr
15bf0 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rno;.      OSTRA
15c00 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
15c10 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15c20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15c30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15c50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
15c60 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
15c70 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
15c80 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
15c90 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53  *)pArg;.      OS
15ca0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
15cb0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15cc0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
15cd0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
15ce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15cf0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
15d00 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
15d10 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
15d20 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
15d30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15d40 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
15d50 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
15d60 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
15d70 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
15d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15da0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
15db0 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
15dc0 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
15dd0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
15de0 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
15df0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
15e00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15e20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
15e30 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
15e40 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
15e50 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
15e60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53      }.        OS
15e80 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
15e90 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
15ea0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
15eb0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
15ec0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15ed0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
15ee0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
15ef0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
15f00 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
15f10 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
15f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
15f40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
15f50 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
15f60 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
15f70 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
15f80 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
15f90 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
15fa0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
15fb0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15fc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15fd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15ff0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
16000 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
16010 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
16020 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
16030 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
16040 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
16050 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16060 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16070 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
16080 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
16090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
160a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
160b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
160c0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
160d0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
160e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
160f0 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20  "win32");.      
16100 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
16110 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16120 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
16130 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
16140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16150 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
16160 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
16170 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
16180 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
16190 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
161a0 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
161b0 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
161c0 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  ry = a[0];.     
161d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
161e0 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72  a[0] = win32Ioer
161f0 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
16200 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
16210 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33   ){.        win3
16220 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
16230 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   = a[1];.      }
16240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
16250 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  1] = win32IoerrR
16260 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
16270 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
16280 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
16290 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
162a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
162b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
162c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
162d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
162e0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
162f0 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
16300 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d  TFile = sqlite3M
16310 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65  allocZero( pFile
16320 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
16330 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
16340 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
16350 20 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 70 46    getTempname(pF
16360 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
16370 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
16380 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
16390 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
163a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
163b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
163c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
163d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
163e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
163f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16400 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
16410 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
16420 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
16430 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
16440 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
16450 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
16460 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
16470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16480 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
16490 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
164a0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
164b0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
164c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
164d0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
164e0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
164f0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
16500 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
16510 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
16520 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
16530 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
16540 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
16550 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
16560 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
16570 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
16580 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16590 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76   ){.          (v
165b0 6f 69 64 29 77 69 6e 55 6e 6d 61 70 66 69 6c 65  oid)winUnmapfile
165c0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
165d0 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69     rc = winMapfi
165e0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
165f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16600 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16610 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16620 72 63 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%d\n", pFile-
16630 3e 68 2c 20 72 63 29 29 3b 0a 20 20 20 20 20 20  >h, rc));.      
16640 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16650 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53  .#endif.  }.  OS
16660 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
16670 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
16680 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46  _NOTFOUND\n", pF
16690 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
166a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
166b0 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
166c0 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
166d0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
166e0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
166f0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
16700 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
16710 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
16720 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
16730 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
16740 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
16750 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
16760 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
16770 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
16780 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
16790 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
167a0 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
167b0 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
167c0 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
167d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
167e0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
167f0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
16800 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
16810 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
16820 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
16830 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
16840 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
16850 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
16860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16870 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
16880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
16890 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
168a0 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
168b0 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
168c0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
168d0 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
168e0 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
168f0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
16900 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
16910 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
16920 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16940 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
16950 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
16960 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
16970 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
16980 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
16990 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
169a0 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20  WRITE:0);.}../* 
169b0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
169c0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
169d0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
169e0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
169f0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
16a00 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
16a10 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
16a20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
16a30 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
16a40 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
16a50 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
16a60 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
16a70 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
16a80 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
16a90 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
16aa0 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
16ab0 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
16ac0 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
16ad0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
16ae0 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
16af0 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
16b00 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
16b10 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
16b20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
16b30 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
16b40 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
16b50 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
16b60 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
16b70 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
16b80 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
16b90 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
16ba0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
16bb0 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
16bc0 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
16bd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
16be0 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
16bf0 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
16c00 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
16c10 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
16c20 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
16c30 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
16c40 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
16c50 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
16c60 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
16c70 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
16c80 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
16c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16ca0 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
16cb0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16cc0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
16cd0 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
16ce0 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
16cf0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
16d00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16d10 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
16d20 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16d30 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
16d40 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
16d50 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
16d60 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
16d70 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
16d80 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
16d90 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
16da0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
16db0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
16dc0 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
16dd0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
16de0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
16df0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
16e00 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
16e10 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
16e20 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
16e30 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
16e40 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
16e50 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
16e60 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
16e70 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
16e80 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
16e90 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
16ea0 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
16eb0 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
16ec0 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
16ed0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
16ee0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
16ef0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
16f00 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
16f10 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
16f20 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
16f30 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
16f40 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
16f50 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
16f60 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
16f70 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
16f80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
16f90 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
16fa0 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
16fb0 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ext .**.** The f
16fc0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
16fd0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
16fe0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
16ff0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
17000 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
17010 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
17020 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
17030 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
17040 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
17050 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
17060 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
17070 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
17080 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
17090 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
170a0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
170b0 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
170c0 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
170d0 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
170e0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
170f0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
17100 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
17110 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
17120 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
17130 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
17140 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
17150 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
17160 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
17170 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
17180 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
17190 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
171a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
171b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
171c0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
171d0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
171e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
171f0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
17200 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
17210 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
17220 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
17230 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
17240 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
17250 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
17260 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
17270 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
17280 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
17290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
172a0 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
172b0 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
172c0 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
172d0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
172e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
172f0 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
17300 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
17310 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
17320 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
17330 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
17340 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
17350 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
17360 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
17370 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
17380 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
17390 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
173a0 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
173b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
173c0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
173d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
173e0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
173f0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
17400 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
17410 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
17420 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
17430 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
17440 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
17450 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
17460 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
17470 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
17480 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
17490 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
174a0 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
174b0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
174c0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
174d0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
174e0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
174f0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
17500 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
17510 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
17520 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
17530 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
17540 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
17550 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
17560 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
17570 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
17580 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
17590 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
175a0 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
175b0 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
175c0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
175d0 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
175e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
175f0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
17600 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
17610 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
17620 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
17630 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
17640 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
17650 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
17660 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
17670 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
17680 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
17690 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
176a0 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
176b0 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
176c0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176e0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
176f0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
17700 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
17710 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
17720 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
17730 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
17740 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
17750 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
17760 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
17770 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
17780 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
17790 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
177a0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
177b0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
177c0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
177d0 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
177e0 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
177f0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
17800 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
17810 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
17820 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
17830 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
17840 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
17850 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
17860 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
17870 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
17880 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
17890 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
178a0 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
178b0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
178c0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
178d0 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
178e0 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
178f0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
17900 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
17910 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
17920 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
17930 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
17940 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
17950 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
17960 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
17970 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
17980 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
17990 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
179a0 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
179b0 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
179c0 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
179d0 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
179e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
179f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17a00 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
17a10 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
17a20 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
17a30 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
17a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17a50 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
17a60 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
17a70 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
17a80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17a90 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
17aa0 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
17ab0 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
17ac0 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
17ad0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
17ae0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
17af0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
17b00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17b10 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
17b20 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
17b30 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  f==0 );..  OSTRA
17b40 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
17b50 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
17b60 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d  offset=%d, size=
17b70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
17b80 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
17b90 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74  , lockType, ofst
17ba0 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  , nByte));..  /*
17bb0 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
17bc0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
17bd0 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
17be0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
17bf0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
17c00 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
17c10 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
17c20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
17c30 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
17c40 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
17c50 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
17c60 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
17c70 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
17c80 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17c90 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
17ca0 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
17cb0 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
17cc0 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
17cd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
17ce0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
17cf0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
17d00 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
17d10 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
17d20 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
17d30 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
17d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
17d50 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
17d60 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
17d70 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17d80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17d90 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
17da0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
17db0 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20  le=%p, func=%s, 
17dc0 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73  errno=%lu, rc=%s
17dd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17de0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
17df0 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48  (lockType == _SH
17e00 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55  M_UNLCK) ? "winU
17e10 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20  nlockFile" :.   
17e20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b          "winLock
17e30 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61  File", pFile->la
17e40 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33  stErrno, sqlite3
17e50 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a  ErrName(rc)));..
17e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17e70 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
17e80 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74  ences to VFS met
17e90 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  hods */.static i
17ea0 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74  nt winOpen(sqlit
17eb0 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68  e3_vfs*,const ch
17ec0 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  ar*,sqlite3_file
17ed0 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61  *,int,int*);.sta
17ee0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
17ef0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
17f00 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
17f10 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  ;../*.** Purge t
17f20 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  he winShmNodeLis
17f30 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
17f40 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68  tries with winSh
17f50 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
17f60 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
17f70 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
17f80 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
17f90 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
17fa0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
17fb0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
17fc0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
17fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
17fe0 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33  ShmPurge(sqlite3
17ff0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
18000 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77  deleteFlag){.  w
18010 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a  inShmNode **pp;.
18020 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b    winShmNode *p;
18030 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61  .  BOOL bRc;.  a
18040 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
18050 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
18060 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
18070 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
18080 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
18090 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
180a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
180b0 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
180c0 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
180d0 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
180e0 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
180f0 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
18100 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
18110 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
18120 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
18130 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
18140 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tex);.      for(
18150 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
18160 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
18170 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69   bRc = osUnmapVi
18180 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
18190 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
181a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
181b0 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20  SHM-PURGE-UNMAP 
181c0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
181d0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
181f0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
18200 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
18210 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
18220 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
18230 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
18240 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
18250 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
18260 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
18270 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  -CLOSE pid=%lu, 
18280 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
18290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
182a0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
182b0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
182c0 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
182d0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
182e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
182f0 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
18300 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
18310 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
18320 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
18330 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18340 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
18350 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
18360 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
18370 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
18380 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18390 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
183a0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
183b0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
183c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
183d0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
183e0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
183f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
18400 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
18410 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
18420 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18430 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
18440 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
18450 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18460 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18470 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
18480 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
18490 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
184a0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
184b0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
184c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
184d0 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
184e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
184f0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
18500 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
18510 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
18520 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
18530 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
18540 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
18550 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
18560 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
18570 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
18580 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
18590 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
185a0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
185b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
185c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
185d0 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
185e0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
185f0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
18600 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
18610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18620 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
18630 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
18640 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
18650 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
18660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18670 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
18680 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
18690 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
186a0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
186b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
186c0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
186d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
18700 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
18710 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
18720 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
18730 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
18740 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
18750 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18770 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
18780 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
18790 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
187a0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
187b0 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
187c0 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
187d0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
187e0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
187f0 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
18800 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
18810 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
18820 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
18830 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
18840 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
18850 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
18860 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
18870 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
18880 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18890 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
188a0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
188b0 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
188c0 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
188d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
188e0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
188f0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
18900 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
18910 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
18920 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18940 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
18950 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
18960 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
18970 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
18980 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
18990 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
189a0 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
189b0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
189c0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
189d0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
189e0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
189f0 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20   ..  /* Look to 
18a00 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
18a10 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
18a20 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
18a30 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
18a40 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
18a50 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
18a60 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
18a70 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
18a80 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
18a90 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
18aa0 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
18ab0 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
18ac0 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
18ad0 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
18ae0 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
18af0 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
18b00 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
18b10 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
18b20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
18b30 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
18b40 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
18b50 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18b60 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
18b70 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
18b80 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
18b90 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
18ba0 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
18bb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
18bc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18bd0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
18be0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
18bf0 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
18c00 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
18c10 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
18c20 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
18c30 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
18c40 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
18c50 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
18c60 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
18c70 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
18c80 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
18c90 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
18ca0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
18cb0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
18cc0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
18cd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18ce0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
18cf0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
18d00 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
18d10 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70    rc = winOpen(p
18d20 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20  DbFd->pVfs,.    
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
18d40 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
18d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18d60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
18d70 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20  e (UTF-8) */.   
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
18d90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53  qlite3_file*)&pS
18da0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20  hmNode->hFile,  
18db0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68  /* File handle h
18dc0 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ere */.         
18dd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18de0 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45  PEN_WAL | SQLITE
18df0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18e00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18e10 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  EATE,.          
18e20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
18e30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
18e40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
18e50 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
18e60 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
18e70 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
18e80 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
18e90 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
18ea0 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
18eb0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
18ec0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
18ed0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
18ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
18ef0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
18f00 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
18f10 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
18f20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
18f30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
18f40 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
18f50 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
18f60 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
18f70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18f90 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
18fa0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
18fb0 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
18fc0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
18fd0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f             "winO
18fe0 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e  penShm", pDbFd->
18ff0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
19000 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
19010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19020 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65       winShmSyste
19030 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
19040 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
19050 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
19060 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
19070 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
19080 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57  e, _SHM_RDLCK, W
19090 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
190a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
190b0 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
190c0 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _err;.  }..  /* 
190d0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
190e0 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
190f0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  of the winShmNod
19100 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
19110 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
19120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19130 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
19140 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
19150 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
19160 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
19170 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
19180 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
19190 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
191a0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
191b0 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
191c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
191d0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
191e0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
191f0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74  of the winShmEnt
19200 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
19210 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
19220 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
19230 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d  w (struct winShm
19240 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
19250 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
19260 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
19270 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
19280 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
19290 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
192a0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
192b0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
192c0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
192d0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
192e0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
192f0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
19300 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
19310 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
19320 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19330 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
19340 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
19350 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
19360 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
19370 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
19380 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19390 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
193a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
193b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
193c0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
193d0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
193e0 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74  rr:.  winShmSyst
193f0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
19400 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
19410 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
19420 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
19430 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20  d->pVfs, 0);    
19440 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
19450 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
19460 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
19470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
19480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19490 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
194a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
194b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
194c0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
194d0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
194e0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
194f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
19500 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
19510 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
19520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19530 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  inShmUnmap(.  sq
19540 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
19550 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19560 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
19570 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
19580 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
19590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
195a0 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69  lete after closi
195b0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ng if true */.){
195c0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
195d0 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  d;       /* Data
195e0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
195f0 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red-memory */.  
19600 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
19610 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
19620 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
19630 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  osed */.  winShm
19640 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
19650 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19660 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
19670 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  file */.  winShm
19680 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
19690 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
196a0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
196b0 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44  ections */..  pD
196c0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
196d0 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
196e0 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
196f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19700 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
19710 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
19720 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
19730 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
19740 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
19750 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
19760 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
19770 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
19780 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
19790 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
197a0 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
197b0 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
197c0 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
197d0 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
197e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
197f0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
19800 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
19810 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
19820 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
19830 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19840 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
19850 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
19860 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
19870 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
19880 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
19890 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
198a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
198b0 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e  le, too */.  win
198c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
198d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
198e0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
198f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
19900 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
19910 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
19920 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
19930 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74  bFd->pVfs, delet
19940 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69  eFlag);.  }.  wi
19950 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
19960 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
19970 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19980 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
19990 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
199a0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
199b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
199c0 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73   winShmLock(.  s
199d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
199e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
199f0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
19a00 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
19a10 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
19a20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
19a30 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
19a40 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
19a50 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
19a60 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
19a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19a80 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
19a90 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
19aa0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
19ad0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
19ae0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
19af0 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
19b00 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  )fd;        /* C
19b10 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
19b20 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
19b30 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  */.  winShm *p =
19b40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
19b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19b60 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
19b70 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
19b80 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20    winShm *pX;   
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
19bb0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
19bc0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69  siblings */.  wi
19bd0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
19be0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
19bf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19c00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
19c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19c20 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
19c30 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
19c60 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
19c70 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
19c80 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
19c90 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
19ca0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
19cb0 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
19cc0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
19cd0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
19ce0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
19cf0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
19d00 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
19d10 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
19d20 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
19d30 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
19d40 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
19d50 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
19d60 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
19d70 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
19d80 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
19d90 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
19da0 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
19db0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
19dc0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
19dd0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a  CLUSIVE)!=0 );..
19de0 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28    mask = (u16)((
19df0 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  1U<<(ofst+n)) - 
19e00 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61  (1U<<ofst));.  a
19e10 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
19e20 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
19e30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19e40 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
19e50 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
19e60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
19e70 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
19e80 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
19e90 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
19ea0 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
19eb0 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
19ec0 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
19ed0 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
19ee0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
19ef0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
19f00 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
19f10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
19f20 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
19f30 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
19f40 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
19f50 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
19f60 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
19f70 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
19f80 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
19f90 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
19fa0 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
19fb0 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
19fc0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
19fd0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
19fe0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
19ff0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1a000 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1a010 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
1a020 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1a030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
1a060 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
1a070 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1a080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a090 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1a0a0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1a0b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1a0c0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
1a0d0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a0e0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1a0f0 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1a100 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1a110 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1a120 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1a130 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1a140 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1a150 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1a160 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1a170 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1a180 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1a190 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1a1a0 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1a1b0 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1a1c0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1a1d0 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1a1e0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1a1f0 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1a200 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1a210 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1a220 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1a230 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1a240 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1a250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1a260 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a280 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1a290 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1a2a0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1a2b0 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1a2c0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1a2d0 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1a2e0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1a2f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a300 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1a310 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1a320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1a330 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1a340 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1a350 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1a360 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1a370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a390 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1a3a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1a3b0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1a3c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1a3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a3e0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1a3f0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1a400 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a410 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1a420 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1a430 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1a440 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1a450 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1a460 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1a470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1a480 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1a490 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1a4a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1a4b0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1a4c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1a4d0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1a4e0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1a4f0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1a500 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1a510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a520 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1a530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a540 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
1a550 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
1a560 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1a570 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
1a580 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
1a590 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
1a5a0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
1a5b0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
1a5c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a5e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1a5f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1a600 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1a610 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1a620 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
1a630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
1a650 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
1a660 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
1a670 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
1a680 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
1a690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a6a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1a6b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1a6c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
1a6d0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70  ACE(("SHM-LOCK p
1a6e0 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73  id=%lu, id=%d, s
1a6f0 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20  haredMask=%03x, 
1a700 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72  exclMask=%03x, r
1a710 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1a720 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1a730 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e  ProcessId(), p->
1a740 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  id, p->sharedMas
1a750 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
1a760 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a770 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a790 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1a7a0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
1a7b0 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
1a7c0 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
1a7d0 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
1a7e0 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
1a7f0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
1a800 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
1a810 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
1a820 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
1a830 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
1a840 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
1a850 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1a860 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
1a870 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
1a880 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1a890 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
1a8a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1a8b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1a8c0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
1a8d0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1a8e0 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
1a8f0 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
1a900 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
1a910 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1a920 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1a930 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
1a940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a950 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1a960 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1a970 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
1a980 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
1a990 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1a9a0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1a9b0 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1a9c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1a9d0 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
1a9e0 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
1a9f0 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
1aa00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1aa10 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
1aa20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1aa30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1aa40 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1aa50 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1aa60 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1aa70 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1aa80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1aa90 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
1aaa0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
1aab0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1aac0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
1aad0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
1aae0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
1aaf0 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
1ab00 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
1ab10 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
1ab20 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
1ab30 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
1ab40 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
1ab50 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1ab60 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
1ab70 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1ab80 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1ab90 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1aba0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
1abb0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1abc0 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1abd0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1abe0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1abf0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1ac00 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1ac10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1ac20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1ac30 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1ac40 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1ac50 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1ac60 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1ac70 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
1ac80 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
1ac90 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1aca0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
1acb0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
1acc0 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
1acd0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1ace0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1acf0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
1ad00 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1ad10 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1ad20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1ad30 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1ad40 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1ad50 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1ad60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1ad70 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1ad80 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1ad90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ada0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1adb0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1adc0 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
1add0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ade0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1adf0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1ae00 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1ae10 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1ae20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1ae30 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1ae40 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1ae50 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1ae60 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
1ae70 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1ae80 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1ae90 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1aea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1aeb0 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
1aec0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
1aed0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
1aee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1aef0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1af00 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
1af10 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
1af20 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1af30 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
1af40 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1af50 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
1af60 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
1af70 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1af80 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
1af90 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
1afa0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1afb0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1afc0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
1afd0 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
1afe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1aff0 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
1b000 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1b010 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1b020 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1b030 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1b040 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1b050 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1b060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b070 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
1b080 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
1b090 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
1b0a0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1b0b0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1b0c0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1b0d0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
1b0e0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1b0f0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1b100 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
1b110 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b120 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
1b130 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
1b140 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
1b150 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
1b160 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1b170 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1b180 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1b190 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
1b1a0 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1b1b0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1b1c0 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
1b1d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b1f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1b200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1b210 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1b220 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1b230 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1b240 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1b250 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1b260 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1b270 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1b280 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1b290 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1b2a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1b2b0 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1b2c0 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1b2d0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1b2e0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1b2f0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1b300 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1b310 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1b320 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1b330 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1b340 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1b350 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1b360 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1b370 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1b380 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1b390 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1b3a0 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1b3b0 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1b3c0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1b3d0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1b3e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1b3f0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b400 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1b410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b420 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b430 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1b440 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1b450 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1b460 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1b470 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
1b480 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1b490 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1b4a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1b4b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b4c0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1b4d0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1b4e0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1b4f0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1b500 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1b510 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
1b520 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
1b530 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
1b540 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1b550 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
1b560 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
1b570 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1b580 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
1b590 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1b5a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
1b5b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1b5c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
1b5d0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
1b5e0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
1b5f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1b600 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
1b610 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
1b620 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
1b630 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
1b640 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
1b650 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
1b660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b670 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
1b680 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
1b690 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b6a0 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
1b6b0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1b6c0 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
1b6d0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
1b6e0 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1b6f0 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
1b700 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1b710 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1b720 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b730 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
1b740 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1b750 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
1b760 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20  de->hFile.h, .  
1b770 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1b780 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
1b790 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
1b7a0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1b7b0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1b7c0 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20  _HAS_ANSI).     
1b7d0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1b7e0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
1b7f0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
1b800 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1b810 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1b820 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1b830 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1b840 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b850 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70  SHM-MAP-CREATE p
1b860 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1b870 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
1b880 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1b890 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1b8a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1b8b0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1b8c0 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1b8d0 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f         hMap ? "o
1b8e0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1b8f0 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20  .      if( hMap 
1b900 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1b910 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64  Offset = pShmNod
1b920 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
1b930 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ion;.        int
1b940 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1b950 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1b960 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1b970 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69  nGranularity;.#i
1b980 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1b990 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  T.        pMap =
1b9a0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1b9b0 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49  FromApp(hMap, FI
1b9c0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1b9d0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1b9e0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65            iOffse
1b9f0 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
1ba00 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
1ba10 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
1ba20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
1ba30 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1ba40 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
1ba50 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1ba60 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
1ba80 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
1ba90 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
1baa0 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
1bab0 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
1bac0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1bad0 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70  (("SHM-MAP-MAP p
1bae0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1baf0 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1bb00 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ze=%d, rc=%s\n",
1bb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1bb30 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
1bb40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
1bb50 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
1bb60 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
1bb70 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
1bb80 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1bb90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
1bba0 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
1bbb0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1bbc0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1bbd0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
1bbe0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1bbf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1bc00 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
1bc10 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1bc20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1bc30 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
1bc40 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1bc50 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
1bc60 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
1bc70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1bc80 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1bc90 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
1bca0 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1bcb0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
1bcc0 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
1bcd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1bce0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1bcf0 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
1bd00 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1bd10 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
1bd20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
1bd30 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
1bd40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
1bd50 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
1bd60 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
1bd70 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1bd80 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1bd90 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1bda0 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1bdb0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1bdc0 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
1bdd0 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
1bde0 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
1bdf0 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
1be00 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
1be10 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
1be20 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
1be30 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1be40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1be50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1be60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1be70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
1be80 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
1be90 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
1bea0 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
1beb0 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
1bec0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
1bed0 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
1bee0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1bef0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
1bf00 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74  *.** Cleans up t
1bf10 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
1bf20 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
1bf30 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a  d file, if any..
1bf40 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1bf50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74  X_MMAP_SIZE>0.st
1bf60 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
1bf70 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1bf80 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
1bf90 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f   pFile!=0 );.  O
1bfa0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1bfb0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1bfc0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1bfd0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1bfe0 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61  .           "mma
1bff0 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70  pSize=%lld, mmap
1c000 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c  SizeActual=%lld,
1c010 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c   mmapSizeMax=%ll
1c020 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1c030 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c040 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c050 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46   pFile->hMap, pF
1c060 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
1c070 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1c080 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69  e->mmapSize, pFi
1c090 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1c0a0 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  al, pFile->mmapS
1c0b0 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20  izeMax));.  if( 
1c0c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c0d0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
1c0e0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1c0f0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c100 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
1c110 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1c120 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1c130 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1c140 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c150 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
1c160 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c180 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1c190 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", osGetCu
1c1a0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c1b0 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
1c1c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
1c1d0 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
1c1e0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1c1f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c200 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1c210 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 31 22 2c      "winUnmap1",
1c240 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1c250 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1c260 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
1c270 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
1c280 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
1c290 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1c2a0 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ual = 0;.  }.  i
1c2b0 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d  f( pFile->hMap!=
1c2c0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
1c2d0 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70  !osCloseHandle(p
1c2e0 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20  File->hMap) ){. 
1c2f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1c300 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1c310 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1c320 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1c330 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1c340 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
1c350 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1c360 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
1c370 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c380 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c390 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1c3a0 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65  hMap));.      re
1c3b0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1c3c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1c3d0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1c3e0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c400 77 69 6e 55 6e 6d 61 70 32 22 2c 20 70 46 69 6c  winUnmap2", pFil
1c410 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
1c420 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  .    pFile->hMap
1c430 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
1c440 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c450 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c460 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1c470 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1c480 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1c490 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1c4a0 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
1c4b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c4c0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
1c4d0 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
1c4e0 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
1c4f0 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
1c500 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
1c510 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
1c520 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
1c530 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
1c540 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
1c550 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
1c560 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
1c570 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
1c580 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
1c590 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
1c5a0 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
1c5b0 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
1c5c0 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
1c5d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1c5e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1c5f0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
1c600 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
1c610 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
1c620 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
1c630 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
1c640 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
1c650 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
1c660 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
1c670 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
1c680 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
1c690 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c6a0 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
1c6b0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
1c6c0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
1c6d0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
1c6e0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
1c6f0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
1c700 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
1c710 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
1c720 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68  MMAP_SIZE, which
1c730 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
1c740 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1c750 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c760 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
1c770 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
1c780 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
1c790 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
1c7a0 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
1c7b0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
1c7c0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1c7d0 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
1c7e0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1c7f0 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
1c800 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c  inFile *pFd, sql
1c810 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
1c820 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
1c830 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
1c840 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1c850 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
1c860 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
1c870 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1c880 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1c890 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69  lu, pFile=%p, si
1c8a0 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ze=%lld\n",.    
1c8b0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1c8c0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1c8d0 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  pFd, nByte));.. 
1c8e0 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
1c8f0 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
1c900 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1c910 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72   nMap<0 ){.    r
1c920 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1c930 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
1c940 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20  Fd, &nMap);.    
1c950 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1c960 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1c970 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1c980 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1c990 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a  IOERR_FSTAT\n",.
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1c9b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1c9c0 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
1c9d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c9e0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1c9f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1ca00 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
1ca10 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
1ca20 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
1ca30 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70  eMax;.  }.  nMap
1ca40 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e   &= ~(sqlite3_in
1ca50 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e  t64)(winSysInfo.
1ca60 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  dwPageSize - 1);
1ca70 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30  . .  if( nMap==0
1ca80 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   && pFd->mmapSiz
1ca90 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  e>0 ){.    winUn
1caa0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
1cab0 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  }.  if( nMap!=pF
1cac0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
1cad0 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1cae0 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f  0;.    DWORD pro
1caf0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1cb00 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20  ONLY;.    DWORD 
1cb10 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50  flags = FILE_MAP
1cb20 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55  _READ;..    winU
1cb30 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1cb40 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72     if( (pFd->ctr
1cb50 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
1cb60 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  _RDONLY)==0 ){. 
1cb70 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
1cb80 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  AGE_READWRITE;. 
1cb90 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49       flags |= FI
1cba0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20  LE_MAP_WRITE;.  
1cbb0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f    }.#if SQLITE_O
1cbc0 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d  S_WINRT.    pFd-
1cbd0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1cbe0 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1cbf0 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  pp(pFd->h, NULL,
1cc00 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20   protect, nMap, 
1cc10 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
1cc20 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1cc30 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
1cc40 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1cc50 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1cc60 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
1cc70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1cca0 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
1ccb0 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1cce0 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
1ccf0 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  fff), NULL);.#el
1cd00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cd10 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1cd20 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1cd30 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1cd40 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
1cd50 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1cd80 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1cd90 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1cdd0 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1cde0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1cdf0 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
1ce00 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
1ce10 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1ce20 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1ce30 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1ce40 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ce50 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
1ce60 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ce80 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46 64  winMapfile", pFd
1ce90 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1cea0 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72  /* Log the error
1ceb0 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e  , but continue n
1cec0 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20  ormal operation 
1ced0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
1cee0 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52  te */.      OSTR
1cef0 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43  ACE(("MAP-FILE-C
1cf00 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  REATE pid=%lu, p
1cf10 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1cf20 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1cf30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cf40 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1cf50 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1cf60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cf70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1cf80 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
1cf90 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1cfa0 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
1cfb0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1cfc0 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
1cfd0 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
1cfe0 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
1cff0 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
1d000 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1d010 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
1d020 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
1d030 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1d040 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1d050 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
1d060 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1d070 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
1d080 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
1d090 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
1d0a0 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
1d0b0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
1d0c0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
1d0d0 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
1d0e0 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
1d0f0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1d100 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1d110 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
1d120 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1d130 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1d140 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d160 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46  "winMapfile", pF
1d170 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1d180 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1d190 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  ILE-MAP pid=%lu,
1d1a0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1d1b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1d1c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d1d0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d1e0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1d1f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d210 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
1d220 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20  gion = pNew;.   
1d230 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
1d240 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e   nMap;.    pFd->
1d250 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
1d260 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53   nMap;.  }..  OS
1d270 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1d280 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1d290 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1d2a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d2b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1d2c0 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
1d2d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d2e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1d2f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1d300 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
1d310 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
1d320 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d330 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
1d340 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
1d350 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
1d360 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
1d370 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
1d380 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
1d390 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
1d3a0 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
1d3b0 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
1d3c0 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
1d3d0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1d3e0 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
1d3f0 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
1d400 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1d410 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
1d420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d430 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
1d440 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
1d450 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
1d460 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d470 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
1d480 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
1d490 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
1d4a0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
1d4b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1d4c0 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
1d4d0 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
1d4e0 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
1d4f0 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
1d500 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
1d510 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68  lling winUnfetch
1d520 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1d530 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74  t winFetch(sqlit
1d540 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
1d550 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
1d560 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
1d570 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1d580 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
1d590 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
1d5a0 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
1d5b0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
1d5c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
1d5d0 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20  if.  *pp = 0;.. 
1d5e0 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
1d5f0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1d600 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %p, offset=%lld,
1d610 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25   amount=%d, pp=%
1d620 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
1d630 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d640 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f  cessId(), fd, iO
1d650 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a  ff, nAmt, pp));.
1d660 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1d670 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1d680 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  ( pFd->mmapSizeM
1d690 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ax>0 ){.    if( 
1d6a0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
1d6b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1d6c0 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1d6d0 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
1d6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d6f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54  K ){.        OST
1d700 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
1d710 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1d720 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1d730 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d740 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d750 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1d760 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1d770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d790 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
1d7a0 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
1d7b0 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
1d7c0 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
1d7d0 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
1d7e0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
1d7f0 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
1d800 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
1d810 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1d820 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d830 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20   pp=%p, *pp=%p, 
1d840 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1d850 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1d860 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d870 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70  d(), fd, pp, *pp
1d880 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1d890 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d8a0 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
1d8b0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
1d8c0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1d8d0 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
1d8e0 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
1d8f0 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
1d900 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
1d910 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
1d920 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
1d930 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1d940 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
1d950 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1d960 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1d970 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
1d980 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1d990 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
1d9a0 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
1d9b0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
1d9c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
1d9d0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1d9e0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
1d9f0 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
1da00 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
1da10 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
1da20 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
1da30 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
1da40 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
1da50 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1da60 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
1da70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1da80 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  inUnfetch(sqlite
1da90 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
1daa0 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
1dab0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1dac0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
1dad0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
1dae0 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
1daf0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
1db00 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1db10 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
1db20 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
1db30 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
1db40 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
1db50 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
1db60 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
1db70 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
1db80 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
1db90 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
1dba0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
1dbb0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
1dbc0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
1dbd0 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
1dbe0 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
1dbf0 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
1dc00 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
1dc10 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
1dc20 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
1dc30 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
1dc40 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
1dc50 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
1dc60 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
1dc70 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
1dc80 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
1dc90 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
1dca0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1dcb0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1dcc0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
1dcd0 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
1dce0 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
1dcf0 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
1dd00 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
1dd10 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
1dd20 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
1dd30 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
1dd40 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
1dd50 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
1dd60 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
1dd70 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
1dd80 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
1dd90 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
1dda0 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
1ddb0 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  an can be omitte
1ddc0 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
1ddd0 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
1dde0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
1ddf0 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
1de00 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
1de10 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
1de20 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
1de30 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
1de40 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
1de50 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1de60 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1de70 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1de80 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1de90 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
1dea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1deb0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1dec0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1ded0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1dee0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1def0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1df00 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1df10 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1df20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1df30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1df50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1df90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
1dfa0 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
1dfb0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
1dfc0 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
1dfd0 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
1dfe0 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
1dff0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1e000 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1e010 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
1e020 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e040 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1e050 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1e080 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
1e0b0 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
1e0e0 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
1e110 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1e140 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
1e170 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
1e1a0 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
1e1d0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
1e1e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1e1f0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1e200 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
1e210 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
1e220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1e230 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
1e240 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1e270 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
1e280 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
1e290 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
1e2a0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1e2b0 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
1e2e0 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
1e310 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
1e320 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1e330 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1e340 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
1e350 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
1e360 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
1e370 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
1e380 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
1e390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
1e3a0 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
1e3b0 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
1e3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
1e3d0 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
1e3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e420 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1e430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e440 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1e450 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1e460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e470 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1e480 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1e490 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1e4a0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1e4b0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1e4c0 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1e4d0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .*/../*.** Conve
1e4e0 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
1e4f0 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
1e500 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
1e510 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
1e520 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
1e530 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
1e540 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1e550 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
1e560 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1e570 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
1e580 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1e590 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
1e5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e5b0 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
1e5c0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
1e5d0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
1e5e0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
1e5f0 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
1e600 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
1e610 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
1e620 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1e630 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1e640 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e650 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1e660 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1e670 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1e680 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1e690 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1e6a0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1e6b0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1e6c0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1e6d0 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1e6e0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1e6f0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1e700 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1e710 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1e720 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1e730 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e740 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e750 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1e760 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1e770 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1e780 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1e790 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1e7a0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1e7b0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1e7c0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1e7d0 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1e7e0 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1e7f0 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1e800 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61  nTempPath;.  cha
1e810 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49  r zTempPath[SQLI
1e820 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1e830 48 5f 42 59 54 45 53 2b 32 5d 3b 0a 0a 20 20 2f  H_BYTES+2];..  /
1e840 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1e850 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1e860 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1e870 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1e880 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1e890 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1e8a0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1e8b0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1e8c0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1e8d0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1e8e0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1e8f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1e900 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
1e910 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
1e920 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
1e930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1e940 72 69 6e 74 66 28 53 51 4c 49 54 45 5f 57 49 4e  rintf(SQLITE_WIN
1e950 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
1e960 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  S-30, zTempPath,
1e970 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
1e980 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e990 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1e9a0 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  ry);.  }.#if !SQ
1e9b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1e9c0 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
1e9d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
1e9e0 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a  lti;.    WCHAR z
1e9f0 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f  WidePath[SQLITE_
1ea00 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43  WIN32_MAX_PATH_C
1ea10 48 41 52 53 5d 3b 0a 20 20 20 20 69 66 28 20 6f  HARS];.    if( o
1ea20 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 53 51  sGetTempPathW(SQ
1ea30 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
1ea40 41 54 48 5f 43 48 41 52 53 2d 33 30 2c 20 7a 57  ATH_CHARS-30, zW
1ea50 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
1ea60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1ea70 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1ea80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
1ea90 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
1eaa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1eab0 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
1eac0 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
1ead0 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
1eae0 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
1eaf0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
1eb00 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
1eb10 65 33 5f 73 6e 70 72 69 6e 74 66 28 53 51 4c 49  e3_snprintf(SQLI
1eb20 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1eb30 48 5f 42 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d  H_BYTES-30, zTem
1eb40 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75  pPath, "%s", zMu
1eb50 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
1eb60 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
1eb70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eb80 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
1eb90 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
1eba0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ebb0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
1ebc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ebd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1ebe0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1ebf0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1ec00 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
1ec10 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
1ec20 20 7a 4d 62 63 73 50 61 74 68 5b 53 51 4c 49 54   zMbcsPath[SQLIT
1ec30 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
1ec40 5f 42 59 54 45 53 5d 3b 0a 20 20 20 20 69 66 28  _BYTES];.    if(
1ec50 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
1ec60 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1ec70 5f 50 41 54 48 5f 42 59 54 45 53 2d 33 30 2c 20  _PATH_BYTES-30, 
1ec80 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b  zMbcsPath)==0 ){
1ec90 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1eca0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
1ecb0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
1ecc0 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
1ecd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ece0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
1ecf0 4d 50 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  MPPATH;.    }.  
1ed00 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
1ed10 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
1ed20 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
1ed30 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
1ed40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ed50 73 6e 70 72 69 6e 74 66 28 53 51 4c 49 54 45 5f  snprintf(SQLITE_
1ed60 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
1ed70 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61  YTES-30, zTempPa
1ed80 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  th, "%s", zUtf8)
1ed90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1eda0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
1edb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53   }else{.      OS
1edc0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
1edd0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
1ede0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
1edf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ee00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1ee10 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  M;.    }.  }.#el
1ee20 73 65 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f  se.  else{.    /
1ee30 2a 0a 20 20 20 20 2a 2a 20 43 6f 6d 70 69 6c 65  *.    ** Compile
1ee40 64 20 77 69 74 68 6f 75 74 20 41 4e 53 49 20 73  d without ANSI s
1ee50 75 70 70 6f 72 74 20 61 6e 64 20 74 68 65 20 63  upport and the c
1ee60 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6e 67  urrent operating
1ee70 20 73 79 73 74 65 6d 0a 20 20 20 20 2a 2a 20 69   system.    ** i
1ee80 73 20 6e 6f 74 20 57 69 6e 64 6f 77 73 20 4e 54  s not Windows NT
1ee90 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
1eea0 74 20 7a 65 72 6f 20 74 68 65 20 74 65 6d 70 6f  t zero the tempo
1eeb0 72 61 72 79 20 62 75 66 66 65 72 2e 0a 20 20 20  rary buffer..   
1eec0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   */.    memset(z
1eed0 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 53 51 4c  TempPath, 0, SQL
1eee0 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
1eef0 54 48 5f 42 59 54 45 53 2b 32 29 3b 0a 20 20 7d  TH_BYTES+2);.  }
1ef00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ef10 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1ef20 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 65 6c 73 65   */.#else.  else
1ef30 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1ef40 43 6f 6d 70 69 6c 65 64 20 66 6f 72 20 57 69 6e  Compiled for Win
1ef50 52 54 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  RT and the sqlit
1ef60 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1ef70 79 20 69 73 20 6e 6f 74 20 73 65 74 3b 0a 20 20  y is not set;.  
1ef80 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 2c 20    ** therefore, 
1ef90 6a 75 73 74 20 7a 65 72 6f 20 74 68 65 20 74 65  just zero the te
1efa0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 2e 0a  mporary buffer..
1efb0 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
1efc0 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20  t(zTempPath, 0, 
1efd0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1efe0 5f 50 41 54 48 5f 42 59 54 45 53 2b 32 29 3b 0a  _PATH_BYTES+2);.
1eff0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53    }.#endif /* !S
1f000 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
1f010 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
1f020 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
1f030 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
1f040 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
1f050 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
1f060 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
1f070 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
1f080 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
1f090 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71    nTempPath = sq
1f0a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
1f0b0 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28  empPath);..  if(
1f0c0 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71   (nTempPath + sq
1f0d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
1f0e0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1f0f0 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
1f100 6e 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52  nBuf ){.    OSTR
1f110 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
1f120 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
1f130 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
1f140 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1f150 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  R;.  }..  for(i=
1f160 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26  nTempPath; i>0 &
1f170 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d  & zTempPath[i-1]
1f180 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20  =='\\'; i--){}. 
1f190 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20   zTempPath[i] = 
1f1a0 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0;..  sqlite3_sn
1f1b0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20  printf(nBuf-18, 
1f1c0 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68  zBuf, (nTempPath
1f1d0 20 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20   > 0) ?.        
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f1f0 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
1f200 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53  _FILE_PREFIX : S
1f210 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1f220 50 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20  PREFIX,.        
1f230 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
1f240 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  Path);.  j = sql
1f250 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
1f260 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
1f270 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
1f280 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
1f290 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
1f2a0 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
1f2b0 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
1f2c0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
1f2d0 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
1f2e0 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
1f2f0 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
1f300 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20  ;.  zBuf[j+1] = 
1f310 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
1f320 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
1f330 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
1f340 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
1f350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
1f370 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1f380 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
1f390 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
1f3a0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
1f3b0 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
1f3c0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1f3d0 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
1f3e0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
1f3f0 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
1f400 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
1f410 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1f420 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
1f430 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
1f440 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
1f450 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
1f460 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
1f470 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e  rrno;..  if( isN
1f480 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
1f490 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
1f4a0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1f4b0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1f4c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
1f4d0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
1f4e0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
1f4f0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
1f500 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1f510 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
1f520 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
1f550 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
1f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
1f580 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
1f590 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1f5a0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
1f5b0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
1f5c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f5d0 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a   Invalid name? *
1f5e0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72  /.    }.    attr
1f5f0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1f600 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23  ileAttributes;.#
1f610 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1f620 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
1f630 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1f640 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
1f650 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1f660 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
1f670 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e  return (attr!=IN
1f680 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1f690 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26  BUTES) && (attr&
1f6a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1f6b0 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a  IRECTORY);.}../*
1f6c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
1f6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f6e0 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
1f6f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1f700 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1f710 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1f720 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
1f730 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1f740 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
1f750 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1f760 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
1f770 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
1f780 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
1f790 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f7b0 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
1f7c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
1f7d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1f7e0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
1f7f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
1f800 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
1f810 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57   lastErrno;.  DW
1f820 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63  ORD dwDesiredAcc
1f830 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53  ess;.  DWORD dwS
1f840 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52  hareMode;.  DWOR
1f850 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70  D dwCreationDisp
1f860 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  osition;.  DWORD
1f870 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1f880 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53  butes = 0;.#if S
1f890 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1f8a0 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b   int isTemp = 0;
1f8b0 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
1f8c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
1f8d0 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20  ile*)id;.  void 
1f8e0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20  *zConverted;    
1f8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1f900 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
1f910 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
1f920 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
1f930 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65  = zName; /* File
1f940 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e  name in UTF-8 en
1f950 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
1f960 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
1f970 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
1f980 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
1f990 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
1f9a0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
1f9b0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
1f9c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
1f9d0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
1f9e0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
1f9f0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
1fa00 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 53 51 4c  har zTmpname[SQL
1fa10 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
1fa20 54 48 5f 42 59 54 45 53 2b 32 5d 3b 20 2f 2a 20  TH_BYTES+2]; /* 
1fa30 42 75 66 66 65 72 20 66 6f 72 20 74 65 6d 70 20  Buffer for temp 
1fa40 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69  filename */..  i
1fa50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fa60 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
1fa70 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
1fa80 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
1fa90 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
1faa0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1fab0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
1fac0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
1fad0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
1fae0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
1faf0 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
1fb00 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
1fb10 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
1fb20 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
1fb30 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
1fb40 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1fb50 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1fb60 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
1fb70 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
1fb80 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
1fb90 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
1fba0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
1fbb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1fbc0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
1fbd0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
1fbe0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1fbf0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1fc00 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
1fc10 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
1fc20 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
1fc30 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
1fc40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1fc50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1fc60 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
1fc70 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1fc80 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
1fc90 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1fca0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
1fcb0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
1fcc0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
1fcd0 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
1fce0 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
1fcf0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
1fd00 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
1fd10 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
1fd20 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
1fd30 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
1fd40 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
1fd50 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
1fd60 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
1fd70 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
1fd80 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
1fd90 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
1fda0 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
1fdb0 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
1fdc0 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
1fdd0 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
1fde0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
1fdf0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
1fe00 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
1fe10 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
1fe20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
1fe30 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
1fe40 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
1fe50 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
1fe60 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
1fe70 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
1fe80 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
1fe90 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
1fea0 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
1feb0 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
1fec0 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
1fed0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
1fee0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
1fef0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
1ff00 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
1ff10 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
1ff20 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
1ff30 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
1ff40 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
1ff50 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
1ff60 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
1ff70 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
1ff80 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
1ff90 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
1ffa0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1ffb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
1ffc0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1ffd0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1ffe0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1fff0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
20000 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
20010 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
20020 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
20030 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
20040 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
20050 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
20060 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
20070 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
20080 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
20090 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
200a0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
200b0 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
200c0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
200d0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
200e0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
200f0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
20100 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
20110 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
20120 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
20130 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
20140 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
20150 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
20160 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
20170 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
20180 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20190 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
201a0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
201b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
201c0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
201d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
201e0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
201f0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
20200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
20210 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
20220 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
20230 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
20240 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
20250 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
20260 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
20270 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
20280 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
20290 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
202a0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
202b0 28 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ( !sqlite3_temp_
202c0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
202d0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
202e0 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20  ITE_ERROR,.     
202f0 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70     "sqlite3_temp
20300 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61  _directory varia
20310 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65  ble should be se
20320 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20  t for WinRT");. 
20330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
20340 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
20350 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
20360 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
20370 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
20380 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
20390 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
203a0 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
203b0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
203c0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
203d0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  sOpenJournal);. 
203e0 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
203f0 61 6d 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ame(SQLITE_WIN32
20400 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2b  _MAX_PATH_BYTES+
20410 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  2, zTmpname);.  
20420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
20440 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
20450 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
20460 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
20470 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
20480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20490 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
204a0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
204b0 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
204c0 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
204d0 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
204e0 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
204f0 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
20500 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
20510 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
20520 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
20530 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
20540 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
20550 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
20560 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
20570 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20580 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
20590 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
205a0 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38  ||.        zUtf8
205b0 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66  Name[strlen(zUtf
205c0 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
205d0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
205e0 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
205f0 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
20600 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
20610 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
20620 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
20630 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
20640 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
20650 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
20660 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
20670 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
20680 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
20690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
206a0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
206b0 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
206c0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
206d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
206e0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
206f0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
20700 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
20710 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
20720 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
20730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20740 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
20750 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
20760 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
20770 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
20780 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
20790 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
207a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
207b0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
207c0 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
207d0 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
207e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
207f0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
20800 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
20810 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61  le is .  ** crea
20820 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
20830 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
20840 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
20850 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20  e access" .  ** 
20860 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
20870 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
20880 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
20890 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
208a0 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
208b0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
208c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
208d0 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
208e0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
208f0 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
20900 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
20910 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
20920 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
20930 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
20940 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
20950 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
20960 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
20970 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
20980 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
20990 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
209a0 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
209b0 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
209c0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
209d0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
209e0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
209f0 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
20a00 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
20a10 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
20a20 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
20a30 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
20a40 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
20a50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20a60 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
20a70 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
20a80 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
20a90 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
20aa0 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
20ab0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
20ac0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
20ad0 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
20b00 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
20b10 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b30 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
20b40 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
20b50 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
20b60 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
20b70 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
20b80 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
20b90 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
20ba0 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
20bb0 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
20bc0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
20bd0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
20be0 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
20bf0 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
20c00 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
20c10 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
20c20 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
20c30 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
20c40 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
20c50 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
20c60 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
20c70 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
20c80 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
20c90 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
20ca0 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20  NDED_PARAMETERS 
20cb0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
20cc0 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  rs;.    extended
20cd0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a  Parameters.dwSiz
20ce0 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54  e = sizeof(CREAT
20cf0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
20d00 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20  PARAMETERS);.   
20d10 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
20d20 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ers.dwFileAttrib
20d30 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20  utes =.         
20d40 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
20d50 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41  ributes & FILE_A
20d60 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20  TTRIBUTE_MASK;. 
20d70 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
20d80 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67  eters.dwFileFlag
20d90 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74  s = dwFlagsAndAt
20da0 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
20db0 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  FLAG_MASK;.    e
20dc0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
20dd0 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46  s.dwSecurityQosF
20de0 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f  lags = SECURITY_
20df0 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65  ANONYMOUS;.    e
20e00 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
20e10 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72  s.lpSecurityAttr
20e20 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  ibutes = NULL;. 
20e30 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
20e40 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46  eters.hTemplateF
20e50 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
20e60 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
20e70 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53  eateFile2((LPCWS
20e80 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
20eb0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
20ee0 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
20f10 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74              &ext
20f40 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29  endedParameters)
20f50 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
20f60 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
20f90 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
20fa0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
20fb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
20fc0 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  */.    }.#else. 
20fd0 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
20fe0 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50  sCreateFileW((LP
20ff0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
21000 2c 0a 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 20 20 20 20                  
21020 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
21030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
21050 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
21060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
21090 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
210c0 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
210f0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
21100 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
21130 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
21140 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
21150 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
21160 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21170 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21180 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
21190 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
211a0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
211b0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
211c0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
211f0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
21220 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
21250 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
21280 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
21290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
212c0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
212f0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
21300 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21320 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  Noop */.    }.  
21330 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f  }.#endif.  logIo
21340 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54  err(cnt);..  OST
21350 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
21360 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
21370 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c  cess=%lx, rc=%s\
21380 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65  n", h, zUtf8Name
21390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44  ,.           dwD
213a0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68  esiredAccess, (h
213b0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
213c0 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
213d0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
213e0 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
213f0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
21400 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
21410 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
21420 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
21430 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
21440 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
21450 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  no, "winOpen", z
21460 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73  Utf8Name);.    s
21470 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21480 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28  verted);.    if(
21490 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
214a0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
214b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
214c0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
214d0 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
214e0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
214f0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a  PEN_READONLY) &.
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50       ~(SQLITE_OP
21520 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
21530 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
21540 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74  ),.         pOut
21550 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
21560 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
21570 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
21580 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
21590 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
215a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
215b0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
215c0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
215d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
215e0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
215f0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
21600 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
21610 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
21620 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
21630 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
21640 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
21650 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c  x, pOutFlags=%p,
21660 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20   *pOutFlags=%d, 
21670 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63  ".           "rc
21680 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
21690 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
216a0 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73  ccess, pOutFlags
216b0 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20  , pOutFlags ?.  
216c0 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c           *pOutFl
216d0 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56  ags : 0, (h==INV
216e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
216f0 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
21700 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c  "ok"));..#if SQL
21710 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
21720 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
21730 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
21740 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
21750 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
21760 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
21770 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
21780 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
21790 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
217a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
217b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
217c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
217d0 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d  EN-CE-LOCK name=
217e0 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e  %s, rc=%s\n", zN
217f0 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
21800 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72  ame(rc)));.    r
21810 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21820 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
21830 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
21840 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
21850 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
21860 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
21870 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21880 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 70 46  rted);.  }..  pF
21890 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
218a0 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
218b0 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
218c0 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  s;.  pFile->h = 
218d0 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  h;.  if( isReado
218e0 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  nly ){.    pFile
218f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
21900 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  INFILE_RDONLY;. 
21910 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
21920 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
21930 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
21940 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
21950 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
21960 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
21970 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
21980 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  .  }.  pFile->la
21990 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
219a0 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61  OR;.  pFile->zPa
219b0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20  th = zName;.#if 
219c0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
219d0 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e  SIZE>0.  pFile->
219e0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70  hMap = NULL;.  p
219f0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
21a00 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
21a10 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mapSize = 0;.  p
21a20 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
21a30 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c  tual = 0;.  pFil
21a40 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
21a50 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21a60 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
21a70 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  dif..  OpenCount
21a80 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
21a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
21aa0 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
21ab0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
21ac0 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
21ad0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
21ae0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
21af0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
21b00 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
21b10 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
21b20 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
21b30 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
21b40 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
21b50 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
21b60 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
21b70 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
21b80 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
21b90 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
21ba0 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
21bb0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
21bc0 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
21bd0 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
21be0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
21bf0 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
21c00 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
21c10 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
21c20 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
21c30 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
21c40 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
21c50 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
21c60 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
21c70 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
21c80 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
21c90 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
21ca0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
21cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21cc0 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
21cd0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
21ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
21cf0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
21d00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21d10 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
21d20 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
21d30 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
21d40 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
21d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
21d60 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
21d70 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
21d80 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21d90 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57  DWORD attr;.  DW
21da0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
21db0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21dc0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
21dd0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
21de0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
21df0 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
21e00 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
21e10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21e20 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
21e30 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
21e40 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
21e50 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
21e60 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
21e70 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
21e80 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
21e90 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
21ea0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
21eb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21ec0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
21ed0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
21ee0 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69  ) ){.    do {.#i
21ef0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
21f00 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49  T.      WIN32_FI
21f10 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
21f20 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
21f30 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
21f40 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
21f50 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
21f60 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c     if ( osGetFil
21f70 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a  eAttributesExW(z
21f80 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69  Converted, GetFi
21f90 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
21fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20      &sAttrData) 
21fd0 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
21fe0 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
21ff0 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
22000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22010 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
22020 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
22030 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
22040 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
22050 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
22060 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
22070 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
22080 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
22090 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
220a0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
220b0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
220c0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
220d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
220e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
220f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
22100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22110 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
22120 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
22130 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
22140 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
22150 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  if.      if ( at
22160 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
22170 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
22180 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
22190 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
221a0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
221b0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
221c0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
221d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
221e0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
221f0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
22200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
22220 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
22230 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
22240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22250 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22260 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
22270 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
22280 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
22290 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
222a0 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
222b0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
222c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
222d0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
222e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
222f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
22300 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
22310 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leW(zConverted) 
22320 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22330 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
22340 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
22350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22360 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
22370 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
22380 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
22390 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
223a0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
223b0 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
223c0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
223d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
223e0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66  hile(1);.  }.#if
223f0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
22400 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
22410 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
22420 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
22430 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f  eAttributesA(zCo
22440 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22450 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
22460 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
22470 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
22480 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
22490 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
224a0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
224b0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
224c0 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
224d0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
224e0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
224f0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
22500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22510 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
22520 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
22530 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
22540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
22550 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
22560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22580 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
22590 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
225a0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
225b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
225c0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
225d0 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
225e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
225f0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
22600 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
22610 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
22620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22630 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
22640 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
22650 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
22660 20 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72   if ( !retryIoer
22670 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
22680 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
22690 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
226a0 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
226b0 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
226c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
226d0 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
226e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
226f0 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54   rc && rc!=SQLIT
22700 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
22710 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  OENT ){.    rc =
22720 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22730 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
22740 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  , lastErrno,.   
22750 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65            "winDe
22760 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
22770 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22780 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
22790 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
227a0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
227b0 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
227c0 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  E name=%s, rc=%s
227d0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
227e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
227f0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
22800 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
22810 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  k the existence 
22820 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
22830 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22840 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
22850 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
22860 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
22870 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
22880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22890 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
228a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
228b0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
228c0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
228d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
228e0 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
228f0 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
22900 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22920 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
22930 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
22940 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
22950 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
22960 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  o;.  void *zConv
22970 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
22980 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
22990 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
229a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
229b0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
229c0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
229d0 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
229e0 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75  flags=%x, pResOu
229f0 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%p\n",.       
22a00 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66      zFilename, f
22a10 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b  lags, pResOut));
22a20 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
22a30 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
22a40 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
22a50 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
22a60 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
22a70 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
22a80 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
22a90 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
22aa0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
22ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22ac0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
22ad0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
22ae0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
22af0 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
22b00 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
22b10 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
22b20 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
22b30 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
22b40 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
22b50 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
22b60 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
22b70 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
22b80 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
22bb0 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20  Standard, .     
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
22be0 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65  ta)) && retryIoe
22bf0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
22c00 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
22c10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
22c20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
22c30 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
22c40 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
22c50 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
22c60 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
22c70 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
22c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22c90 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
22ca0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
22cb0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
22cc0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
22cd0 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
22ce0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
22cf0 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
22d00 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
22d10 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
22d20 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
22d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22d40 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
22d50 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
22d60 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
22d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49  else{.      logI
22d80 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20  oerr(cnt);.     
22d90 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
22da0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
22db0 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e  OUND && lastErrn
22dc0 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o!=ERROR_PATH_NO
22dd0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
22de0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
22df0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
22e00 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
22e10 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c  winAccess", zFil
22e20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
22e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22e40 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22e60 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
22e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22e80 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
22e90 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
22ea0 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
22eb0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
22ec0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
22ed0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74  I.  else{.    at
22ee0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
22ef0 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
22f00 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
22f10 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
22f20 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22f30 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
22f40 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
22f50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
22f60 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
22f70 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
22f80 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
22f90 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
22fa0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
22fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
22fc0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
22fd0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
22fe0 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
22ff0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
23000 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
23010 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49        (attr & FI
23020 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41  LE_ATTRIBUTE_REA
23030 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20  DONLY)==0;.     
23040 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
23050 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
23060 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
23070 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
23080 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
23090 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  c;.  OSTRACE(("A
230a0 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70  CCESS name=%s, p
230b0 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
230c0 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
230d0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
230e0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70      zFilename, p
230f0 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
23100 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
23110 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
23120 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
23130 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
23140 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68  ied path name sh
23150 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72  ould be used ver
23160 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f  batim.  If.** no
23170 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
23180 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ed from this fun
23190 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69  ction, the calli
231a0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
231b0 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74   simply.** use t
231c0 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68  he provided path
231d0 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d   name verbatim -
231e0 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69  OR- resolve it i
231f0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20  nto a full path 
23200 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  name.** using th
23210 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  e GetFullPathNam
23220 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63  e Win32 API func
23230 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62  tion (if availab
23240 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  le)..*/.static B
23250 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69  OOL winIsVerbati
23260 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  mPathname(.  con
23270 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
23280 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  me.){.  /*.  ** 
23290 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
232a0 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66   starts with a f
232b0 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20  orward slash or 
232c0 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20  a backslash, it 
232d0 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61  is either.  ** a
232e0 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c   legal UNC name,
232f0 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69   a volume relati
23300 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61  ve path, or an a
23310 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
23320 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55  e in the.  ** "U
23330 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57  nix" format on W
23340 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69  indows.  There i
23350 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f  s no easy way to
23360 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62   differentiate b
23370 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
23380 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b  final two cases;
23390 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72   therefore, we r
233a0 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20  eturn the safer 
233b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
233c0 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61  TRUE.  ** so tha
233d0 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69  t callers of thi
233e0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
233f0 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65  simply use it ve
23400 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69  rbatim..  */.  i
23410 66 20 28 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  f ( zPathname[0]
23420 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61  =='/' || zPathna
23430 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20  me[0]=='\\' ){. 
23440 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
23450 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
23460 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
23470 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
23480 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
23490 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
234a0 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
234b0 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
234c0 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
234d0 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
234e0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
234f0 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
23500 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
23510 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
23520 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
23530 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
23540 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
23550 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73  )..  */.  if ( s
23560 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
23570 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
23580 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
23590 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
235a0 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
235b0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
235c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
235d0 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
235e0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
235f0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
23600 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
23610 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
23620 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
23630 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
23640 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
23650 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
23660 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
23670 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
23680 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
23690 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
236a0 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
236b0 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
236c0 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
236d0 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
236e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
236f0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
23700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23710 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
23720 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
23730 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
23740 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
23750 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
23760 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
23770 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
23780 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
23790 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
237a0 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237c0 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
237d0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
237e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
237f0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
23800 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
23810 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69  ffer */.){.  .#i
23820 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
23830 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
23840 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
23850 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
23860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23870 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
23880 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
23890 68 6e 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 57 49  hname>=SQLITE_WI
238a0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
238b0 45 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ES );.  assert( 
238c0 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
238d0 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
238e0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
238f0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
23900 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
23910 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
23920 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
23930 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
23940 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
23950 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
23960 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
23970 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
23980 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
23990 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
239a0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
239b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
239c0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
239d0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
239e0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
239f0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
23a00 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
23a10 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
23a20 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
23a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
23a40 20 7a 4f 75 74 5b 53 51 4c 49 54 45 5f 57 49 4e   zOut[SQLITE_WIN
23a50 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
23a60 53 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 63 79  S+1];.    if( cy
23a70 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43  gwin_conv_path(C
23a80 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
23a90 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20  A|CCP_RELATIVE, 
23aa0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
23ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ac0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23ad0 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
23ae0 42 59 54 45 53 2b 31 29 3c 30 20 29 7b 0a 20 20  BYTES+1)<0 ){.  
23af0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
23b00 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
23b10 46 55 4c 4c 50 41 54 48 2c 20 28 44 57 4f 52 44  FULLPATH, (DWORD
23b20 29 65 72 72 6e 6f 2c 20 22 63 79 67 77 69 6e 5f  )errno, "cygwin_
23b30 63 6f 6e 76 5f 70 61 74 68 22 2c 0a 20 20 20 20  conv_path",.    
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52                zR
23b50 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 20 20  elative);.      
23b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
23b70 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b  NTOPEN_FULLPATH;
23b80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23b90 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
23ba0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
23bb0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
23bc0 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20   "%s\\%s",.     
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
23bf0 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20  ectory, zOut);. 
23c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
23c10 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
23c20 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49  (CCP_POSIX_TO_WI
23c30 4e 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  N_A, zRelative, 
23c40 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30 20  zFull, nFull)<0 
23c50 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  ){.      winLogE
23c60 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
23c70 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 28  OPEN_FULLPATH, (
23c80 44 57 4f 52 44 29 65 72 72 6e 6f 2c 20 22 63 79  DWORD)errno, "cy
23c90 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 22 2c  gwin_conv_path",
23ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23cb0 20 20 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20     zRelative);. 
23cc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23cd0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
23ce0 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  PATH;.    }.  }.
23cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23d00 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
23d10 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  (SQLITE_OS_WINCE
23d20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
23d30 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  NRT) && !defined
23d40 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
23d50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
23d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23d70 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  ROR );.  /* WinC
23d80 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
23d90 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
23da0 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
23db0 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f   am told. */.  /
23dc0 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77  * WinRT has no w
23dd0 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20  ay to convert a 
23de0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f  relative path to
23df0 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65   an absolute one
23e00 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69  . */.  if ( sqli
23e10 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
23e20 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
23e30 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
23e40 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
23e50 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
23e60 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
23e70 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
23e80 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
23e90 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
23ea0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
23eb0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
23ec0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
23ed0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
23ee0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
23ef0 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
23f00 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
23f10 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
23f20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
23f30 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
23f40 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
23f50 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
23f60 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
23f70 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
23f80 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
23f90 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
23fa0 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20  "%s\\%s",.      
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23fc0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
23fd0 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65  ctory, zRelative
23fe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23ff0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24000 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
24010 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
24020 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
24030 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65  ative);.  }.  re
24040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24050 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
24060 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
24070 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
24080 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
24090 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44  YGWIN__).  DWORD
240a0 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a   nByte;.  void *
240b0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68  zConverted;.  ch
240c0 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20  ar *zOut;..  /* 
240d0 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d  If this path nam
240e0 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f  e begins with "/
240f0 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69  X:", where "X" i
24100 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63  s any alphabetic
24110 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c  .  ** character,
24120 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69   discard the ini
24130 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68  tial "/" from th
24140 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f  e pathname..  */
24150 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65  .  if( zRelative
24160 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69  [0]=='/' && sqli
24170 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61  te3Isalpha(zRela
24180 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c  tive[1]) && zRel
24190 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b  ative[2]==':' ){
241a0 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
241b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
241c0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
241d0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
241e0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
241f0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
24200 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
24210 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
24220 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
24230 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
24240 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
24250 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
24260 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
24270 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
24280 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
24290 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
242a0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
242b0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
242c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
242d0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
242e0 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
242f0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
24300 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
24310 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
24320 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
24330 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
24340 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
24350 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
24360 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
24370 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
24380 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
24390 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
243a0 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
243b0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
243c0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
243d0 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
243e0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
243f0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
24400 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
24410 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
24420 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
24430 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
24440 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
24450 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
24460 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
24470 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
24480 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20  ll, "%s\\%s",.  
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244a0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
244b0 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61  directory, zRela
244c0 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
244d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
244e0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
244f0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
24500 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
24510 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
24520 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24530 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
24540 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
24550 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  isNT() ){.    LP
24560 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
24570 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
24580 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
24590 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
245a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
245b0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
245c0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
245d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73  SQLITE_ERROR, os
245e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61    "GetFullPathNa
24610 6d 65 57 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65  meW1", zConverte
24620 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24630 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24640 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
24650 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
24660 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d  _FULLPATH;.    }
24670 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
24680 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
24690 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
246a0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
246b0 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
246c0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
246d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
246e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
246f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24700 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
24710 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
24720 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
24730 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
24740 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
24750 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
24760 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
24770 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
24780 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f  (SQLITE_ERROR, o
24790 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
247a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247b0 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e     "GetFullPathN
247c0 61 6d 65 57 32 22 2c 20 7a 43 6f 6e 76 65 72 74  ameW2", zConvert
247d0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
247e0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
247f0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
24800 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
24810 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24820 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
24830 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  LPATH;.    }.   
24840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24850 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
24860 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
24870 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
24880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
24890 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  mp);.  }.#ifdef 
248a0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
248b0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
248c0 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
248d0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
248e0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
248f0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
24900 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
24910 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
24920 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
24930 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f  (SQLITE_ERROR, o
24940 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
24950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24960 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e     "GetFullPathN
24970 61 6d 65 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74  ameA1", zConvert
24980 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
24990 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
249a0 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
249b0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
249c0 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20  N_FULLPATH;.    
249d0 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
249e0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
249f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
24a00 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
24a10 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
24a20 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
24a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24a40 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24a60 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24a70 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
24a80 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
24a90 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
24aa0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
24ab0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
24ac0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
24ad0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
24ae0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73  SQLITE_ERROR, os
24af0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61    "GetFullPathNa
24b20 6d 65 41 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65  meA2", zConverte
24b30 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24b40 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24b50 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24b60 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
24b70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24b80 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
24b90 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
24ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24bb0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
24bc0 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
24bd0 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
24be0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
24bf0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
24c00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
24c10 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
24c20 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
24c30 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
24c40 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
24c50 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
24c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24c70 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
24c80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
24ca0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24cb0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
24cc0 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
24cd0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
24ce0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
24cf0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
24d00 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
24d10 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
24d20 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
24d30 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
24d40 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
24d50 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
24d60 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
24d70 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
24d80 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
24d90 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
24da0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
24db0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
24dc0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
24dd0 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
24de0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
24df0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
24e00 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
24e10 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
24e20 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
24e30 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
24e40 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
24e50 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
24e60 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
24e70 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
24e80 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
24e90 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
24ea0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24eb0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   0;.  }.  if( is
24ec0 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
24ed0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
24ee0 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  h = osLoadPackag
24ef0 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53  edLibrary((LPCWS
24f00 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
24f10 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  );.#else.    h =
24f20 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   osLoadLibraryW(
24f30 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
24f40 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
24f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
24f60 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
24f70 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73  else{.    h = os
24f80 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
24f90 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
24fa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
24fb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
24fc0 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
24fd0 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
24fe0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
24ff0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
25000 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
25010 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
25020 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25030 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74  TER(pVfs);.  get
25040 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
25050 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
25060 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  Buf, zBufOut);.}
25070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77  .static void (*w
25080 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
25090 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a  vfs *pVfs,void *
250a0 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pH,const char *z
250b0 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 55  Sym))(void){.  U
250c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
250d0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
250e0 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f  (void(*)(void))o
250f0 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
25100 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79  ((HANDLE)pH, zSy
25110 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
25120 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
25130 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25140 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
25150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25160 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72  ER(pVfs);.  osFr
25170 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c  eeLibrary((HANDL
25180 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  E)pHandle);.}.#e
25190 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
251a0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
251b0 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
251c0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69   */.  #define wi
251d0 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  nDlOpen  0.  #de
251e0 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20  fine winDlError 
251f0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
25200 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
25210 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a  ne winDlClose 0.
25220 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57  #endif.../*.** W
25230 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20  rite up to nBuf 
25240 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e  bytes of randomn
25250 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a  ess into zBuf..*
25260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25270 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
25280 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
25290 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
252a0 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  uf){.  int n = 0
252b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
252c0 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20  ETER(pVfs);.#if 
252d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
252e0 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b  EST).  n = nBuf;
252f0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
25300 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a  0, nBuf);.#else.
25310 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53    if( sizeof(SYS
25320 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e  TEMTIME)<=nBuf-n
25330 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49   ){.    SYSTEMTI
25340 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53  ME x;.    osGetS
25350 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20  ystemTime(&x);. 
25360 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
25370 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  n], &x, sizeof(x
25380 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
25390 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66  eof(x);.  }.  if
253a0 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
253b0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
253c0 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74  WORD pid = osGet
253d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
253e0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
253f0 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73  zBuf[n], &pid, s
25400 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
25410 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64   n += sizeof(pid
25420 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  );.  }.#if SQLIT
25430 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
25440 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e   sizeof(ULONGLON
25450 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  G)<=nBuf-n ){.  
25460 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20    ULONGLONG cnt 
25470 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
25480 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  64();.    memcpy
25490 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
254a0 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
254b0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
254c0 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  nt);.  }.#else. 
254d0 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
254e0 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
254f0 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73    DWORD cnt = os
25500 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a  GetTickCount();.
25510 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
25520 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
25530 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
25540 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
25550 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
25560 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
25570 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  EGER)<=nBuf-n ){
25580 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  .    LARGE_INTEG
25590 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72  ER i;.    osQuer
255a0 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
255b0 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d  ter(&i);.    mem
255c0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69  cpy(&zBuf[n], &i
255d0 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20  , sizeof(i));.  
255e0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29    n += sizeof(i)
255f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
25600 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
25610 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
25620 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
25630 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
25640 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
25650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25660 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
25670 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
25680 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65  rosec){.  sqlite
25690 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d  3_win32_sleep((m
256a0 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
256b0 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
256c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
256d0 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
256e0 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
256f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
25700 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
25710 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
25720 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
25730 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
25740 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
25750 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
25760 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
25770 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
25780 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
25790 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
257a0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
257b0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
257c0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
257d0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
257e0 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
257f0 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
25800 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
25810 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
25820 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
25830 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
25840 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
25850 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
25860 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
25870 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
25880 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
25890 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
258a0 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
258b0 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
258c0 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
258d0 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
258e0 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
258f0 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
25900 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
25910 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
25920 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
25930 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
25940 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
25950 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
25960 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
25970 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
25980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
25990 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
259a0 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
259b0 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
259c0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
259d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
259e0 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
259f0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
25a00 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
25a10 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
25a20 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
25a30 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
25a40 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
25a50 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
25a60 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
25a70 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
25a80 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
25a90 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
25aa0 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
25ab0 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
25ac0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
25ad0 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
25ae0 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
25af0 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
25b00 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
25b10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
25b20 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25b30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
25b40 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
25b50 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
25b60 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
25b70 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
25b80 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
25b90 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
25ba0 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
25bb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25bc0 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
25bd0 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c  ue = .      (sql
25be0 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
25bf0 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
25c00 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
25c10 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74  0 +.      (sqlit
25c20 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
25c30 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
25c40 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
25c50 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73  MTIME time;.  os
25c60 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
25c70 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
25c80 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
25c90 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
25ca0 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
25cb0 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54    if (!osSystemT
25cc0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
25cd0 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
25ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25cf0 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  OR;.  }.#else.  
25d00 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
25d10 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
25d20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
25d30 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
25d40 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
25d50 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
25d60 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
25d70 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
25d80 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20  tValue) + .     
25d90 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
25da0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
25db0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
25dc0 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
25dd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25de0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
25df0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
25e00 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
25e10 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
25e20 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
25e30 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
25e40 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
25e50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25e60 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
25e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25e80 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
25e90 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
25ea0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
25eb0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
25ec0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
25ed0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
25ee0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
25ef0 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
25f00 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
25f10 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
25f20 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
25f30 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
25f40 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
25f50 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
25f60 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
25f70 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
25f80 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
25f90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
25fa0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
25fb0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
25fc0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
25fd0 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
25fe0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
25ff0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
26010 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
26020 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
26030 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
26040 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
26050 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
26060 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
26070 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
26080 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
26090 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
260a0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
260b0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
260c0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
260d0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
260e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
260f0 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
26100 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
26110 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
26120 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
26130 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
26140 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
26150 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
26160 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
26170 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
26180 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
26190 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
261a0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
261b0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
261c0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
261d0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
261e0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
261f0 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
26200 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
26210 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
26220 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
26230 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
26240 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
26250 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
26260 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
26270 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
26280 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
26290 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
262a0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
262b0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
262c0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
262d0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
262e0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
262f0 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
26300 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
26310 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
26320 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
26330 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
26340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
26350 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
26360 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
26370 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
26380 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
26390 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
263a0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
263b0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
263c0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
263d0 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
263e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
263f0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
26400 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
26410 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
26420 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
26430 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
26440 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
26450 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26460 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
26470 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
26480 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
26490 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
264a0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
264b0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
264c0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
264d0 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
264e0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
264f0 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
26500 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
26510 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
26520 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
26530 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
26540 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
26550 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26560 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
26570 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  n getLastErrorMs
26580 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
26590 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b  (), nBuf, zBuf);
265a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
265b0 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
265c0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
265d0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
265e0 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
265f0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
26600 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
26610 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
26620 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26640 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
26650 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
26660 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
26670 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
26680 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
26690 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
266a0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266c0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
266d0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
266e0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
266f0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
26700 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
26710 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
26720 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
26730 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
26740 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
26750 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
26760 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
26770 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
26780 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
26790 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
267a0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
267b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
267c0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
267d0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
267e0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
267f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
26800 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
26810 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
26820 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
26830 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
26840 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
26850 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
26860 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
26870 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
26880 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
26890 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
268a0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
268b0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
268c0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
268d0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
268e0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
268f0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
26900 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
26910 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
26920 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
26930 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
26940 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
26950 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
26960 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
26970 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
26980 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
26990 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
269a0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
269b0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
269c0 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
269d0 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
269e0 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
269f0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
26a00 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
26a10 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
26a20 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
26a30 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
26a40 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
26a50 6c 29 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f 2a 20  l)==74 );..  /* 
26a60 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
26a70 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
26a80 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
26a90 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
26aa0 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
26ab0 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
26ac0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
26ad0 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
26ae0 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
26af0 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
26b00 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
26b10 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
26b20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
26b30 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
26b40 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b  Granularity>0 );
26b50 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
26b60 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
26b70 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >0 );..  sqlite3
26b80 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
26b90 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74  inVfs, 1);.  ret
26ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
26bb0 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  }..int sqlite3_o
26bc0 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69  s_end(void){ .#i
26bd0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
26be0 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
26bf0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  !=NULL ){.    os
26c00 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
26c10 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
26c20 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
26c30 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
26c50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
26c60 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.