/ Hex Artifact Content
Login

Artifact 7f8cabe0ae13bf6303543197c349bd13a1aaaa0f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
0260: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0270: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0280: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0290: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
02a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
02b0: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64  ** Compiling and
02c0: 20 75 73 69 6e 67 20 57 41 4c 20 6d 6f 64 65 20   using WAL mode 
02d0: 72 65 71 75 69 72 65 73 20 73 65 76 65 72 61 6c  requires several
02e0: 20 41 50 49 73 20 74 68 61 74 20 61 72 65 20 6f   APIs that are o
02f0: 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  nly.** available
0300: 20 69 6e 20 57 69 6e 64 6f 77 73 20 70 6c 61 74   in Windows plat
0310: 66 6f 72 6d 73 20 62 61 73 65 64 20 6f 6e 20 74  forms based on t
0320: 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f  he NT kernel..*/
0330: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
0340: 57 49 4e 4e 54 20 26 26 20 21 64 65 66 69 6e 65  WINNT && !define
0350: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0360: 4c 29 0a 23 20 20 65 72 72 6f 72 20 22 57 41 4c  L).#  error "WAL
0370: 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73 20 73   mode requires s
0380: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
0390: 57 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e 65  Windows NT kerne
03a0: 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a 20 77 69 74  l, compile\. wit
03b0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  h SQLITE_OMIT_WA
03c0: 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  L.".#endif../*.*
03d0: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
03e0: 65 20 57 69 6e 33 32 20 41 4e 53 49 20 41 50 49  e Win32 ANSI API
03f0: 73 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  s available (i.e
0400: 2e 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65  . with certain e
0410: 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73  xceptions.** bas
0420: 65 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c  ed on the sub-pl
0430: 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20  atform)?.*/.#if 
0440: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
0450: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
0460: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0480: 41 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ANSI.#endif../*.
0490: 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74  ** Are most of t
04a0: 68 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65  he Win32 Unicode
04b0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
04c0: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
04d0: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
04e0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
04f0: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0500: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0510: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
0520: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0530: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
0540: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0550: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
0560: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0570: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0580: 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57  (in chars) for W
0590: 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75  in32.  This shou
05a0: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
05b0: 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23  * MAX_PATH..*/.#
05c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
05d0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
05e0: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
05f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
0600: 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f  TH_CHARS   (MAX_
0610: 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  PATH).#endif../*
0620: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0630: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0640: 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54  chars) for WinNT
0650: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0660: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33 32  ormally be.** 32
0670: 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  767..*/.#ifndef 
0680: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0690: 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64  _PATH_CHARS.#  d
06a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
06b0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
06c0: 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64  S   (32767).#end
06d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
06e0: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
06f0: 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72  h (in bytes) for
0700: 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58   Win32.  The MAX
0710: 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69  _PATH macro is i
0720: 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  n.** characters,
0730: 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20   so we allocate 
0740: 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61 72  3 bytes per char
0750: 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77  acter assuming w
0760: 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20  orst-case of.** 
0770: 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72  4-bytes-per-char
0780: 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a  acter for UTF8..
0790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
07a0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
07b0: 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65  _BYTES.#  define
07c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
07d0: 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 28  X_PATH_BYTES   (
07e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
07f0: 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23  _PATH_CHARS*4).#
0800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0810: 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65  imum pathname le
0820: 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20  ngth (in bytes) 
0830: 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73  for WinNT.  This
0840: 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
0850: 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20 73   be.** 32767 * s
0860: 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f  izeof(WCHAR)..*/
0870: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0880: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0890: 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53  YTES.#  define S
08a0: 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
08b0: 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20  PATH_BYTES   \. 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
08e0: 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49  of(WCHAR) * SQLI
08f0: 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
0900: 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a  H_CHARS).#endif.
0910: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65  ./*.** Maximum e
0920: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e  rror message len
0930: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0940: 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66  or WinRT..*/.#if
0950: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0960: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
0970: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
0980: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
0990: 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 34  RMSG_CHARS (1024
09a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
09b0: 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
09c0: 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74 65   if the characte
09d0: 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61  r should be trea
09e0: 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74 6f  ted as a directo
09f0: 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  ry.** separator.
0a00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49  .*/.#ifndef winI
0a10: 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e  sDirSep.#  defin
0a20: 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61 29  e winIsDirSep(a)
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c  (((a) == '/') ||
0a50: 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a   ((a) == '\\')).
0a60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0a70: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
0a80: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0a90: 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72 65  used as the dire
0aa0: 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 2e  ctory separator.
0ab0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 47  .*/.#ifndef winG
0ac0: 65 74 44 69 72 44 65 70 0a 23 20 20 69 66 64 65  etDirDep.#  ifde
0ad0: 66 20 5f 5f 43 59 47 57 49 4e 5f 5f 0a 23 20 20  f __CYGWIN__.#  
0ae0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
0af0: 69 72 44 65 70 28 29 20 20 20 20 20 20 20 20 20  irDep()         
0b00: 20 20 20 20 20 22 2f 22 0a 23 20 20 65 6c 73 65       "/".#  else
0b10: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 77 69 6e  .#    define win
0b20: 47 65 74 44 69 72 44 65 70 28 29 20 20 20 20 20  GetDirDep()     
0b30: 20 20 20 20 20 20 20 20 20 22 5c 5c 22 0a 23 20           "\\".# 
0b40: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0b50: 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20  *.** Do we need 
0b60: 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69  to manually defi
0b70: 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c  ne the Win32 fil
0b80: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66  e mapping APIs f
0b90: 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a  or use with WAL.
0ba0: 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68  ** mode (e.g. th
0bb0: 65 73 65 20 41 50 49 73 20 61 72 65 20 61 76 61  ese APIs are ava
0bc0: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69  ilable in the Wi
0bd0: 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f  ndows CE SDK; ho
0be0: 77 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61  wever, they.** a
0bf0: 72 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  re not present i
0c00: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c  n the header fil
0c10: 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  e)?.*/.#if SQLIT
0c20: 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50  E_WIN32_FILEMAPP
0c30: 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66 69  ING_API && !defi
0c40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0c50: 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f  WAL)./*.** Two o
0c60: 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69  f the file mappi
0c70: 6e 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66  ng APIs are diff
0c80: 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52  erent under WinR
0c90: 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  T.  Figure out w
0ca0: 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e  hich.** set we n
0cb0: 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  eed..*/.#if SQLI
0cc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42  TE_OS_WINRT.WINB
0cd0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
0ce0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
0cf0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41  appingFromApp(HA
0d00: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
0d10: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
0d20: 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c  BUTES, ULONG, UL
0d30: 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b  ONG64, LPCWSTR);
0d40: 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56  ..WINBASEAPI LPV
0d50: 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69  OID WINAPI MapVi
0d60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
0d70: 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55  HANDLE, ULONG, U
0d80: 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b  LONG64, SIZE_T);
0d90: 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e  .#else.#if defin
0da0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0db0: 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53  HAS_ANSI).WINBAS
0dc0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
0dd0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
0de0: 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50  pingA(HANDLE, LP
0df0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0e00: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
0e10: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
0e20: 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e  RD, LPCSTR);.#en
0e30: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
0e40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0e50: 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65  ANSI) */..#if de
0e60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0e70: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e  32_HAS_WIDE).WIN
0e80: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
0e90: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
0ea0: 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c  MappingW(HANDLE,
0eb0: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
0ec0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
0ed0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
0ee0: 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b  DWORD, LPCWSTR);
0ef0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
0f00: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0f10: 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49  HAS_WIDE) */..WI
0f20: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
0f30: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
0f40: 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f  File(HANDLE, DWO
0f50: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0f60: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69  , SIZE_T);.#endi
0f70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
0f80: 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  INRT */../*.** T
0f90: 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  his file mapping
0fa0: 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74   API is common t
0fb0: 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64  o both Win32 and
0fc0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41   WinRT..*/.WINBA
0fd0: 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50  SEAPI BOOL WINAP
0fe0: 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  I UnmapViewOfFil
0ff0: 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64  e(LPCVOID);.#end
1000: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
1010: 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41  32_FILEMAPPING_A
1020: 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  PI && !defined(S
1030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
1040: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
1050: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
1060: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
1070: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
1080: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
1090: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
10a0: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
10b0: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
10c0: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
10d0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
10e0: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
10f0: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
1100: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
1110: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
1120: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
1130: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
1140: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
1150: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
1160: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
1190: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
11a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
11b0: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11d0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
11e0: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
11f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1200: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
1210: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
1220: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
1230: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
1240: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
1250: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
1260: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
1270: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
1280: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
1290: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
12a0: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
12b0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
12c0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
12d0: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
12e0: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
12f0: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
1300: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
1310: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
1320: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
1330: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
1340: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1350: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
1360: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
1370: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
1380: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
1390: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
13a0: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
13b0: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
13c0: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
13d0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
13e0: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
13f0: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
1400: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
1410: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
1420: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1430: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
1440: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
1450: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
1460: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
1470: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
1480: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
1490: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
14a0: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
14b0: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
14c0: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
14d0: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
14e0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
14f0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
1500: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
1510: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
1520: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1530: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
1540: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
1550: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
1560: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
1570: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
1580: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1590: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
15a0: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
15b0: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
15c0: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
15d0: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
15e0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
15f0: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1600: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1610: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1620: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
1630: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
1640: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1650: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1660: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1690: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
16a0: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
16b0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
16c0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
16d0: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
16e0: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
16f0: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1700: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1710: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
1730: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
1740: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1750: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1760: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1770: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
1780: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1790: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
17a0: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
17b0: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
17c0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
17d0: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
17e0: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
17f0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1800: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1810: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1820: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1830: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
1840: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
1850: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
1860: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
1870: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
1880: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1890: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
18a0: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
18b0: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
18c0: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
18d0: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
18e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1900: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1930: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
1940: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
1950: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1970: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1980: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
1990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
19a0: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
19b0: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
19c0: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
19d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
19e0: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
19f0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1a00: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1a10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a20: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1a30: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
1a40: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
1a50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1a60: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
1a70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1a80: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1a90: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1aa0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1ab0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1ac0: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1ae0: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
1af0: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
1b00: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
1b10: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1b20: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
1b30: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
1b40: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
1b50: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
1b60: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
1b70: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
1b90: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ba0: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
1bb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1bc0: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
1bd0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
1be0: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
1bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1c00: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
1c10: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c20: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
1c30: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
1c40: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
1c50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
1c60: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
1c70: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
1c80: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1c90: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1ca0: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
1cb0: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
1cc0: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
1cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1ce0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1cf0: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
1d00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
1d10: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1d20: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
1d30: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
1d40: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1d50: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1d60: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
1d70: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
1d80: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1d90: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1da0: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1dc0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
1dd0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1de0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1df0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
1e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
1e10: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
1e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
1e30: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
1e40: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
1e50: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
1e60: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
1e70: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
1e80: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
1e90: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1ea0: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
1eb0: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
1ec0: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
1ed0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
1ee0: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
1ef0: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
1f00: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
1f10: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
1f20: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
1f30: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
1f40: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
1f50: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
1f60: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
1f70: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
1f80: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
1f90: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
1fa0: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
1fb0: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
1fc0: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
1fd0: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
1fe0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2030: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
2040: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
2050: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2060: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
2070: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
2080: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
2090: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
20a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
20b0: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
20c0: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
20d0: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
20e0: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
20f0: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
2100: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
2110: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
2120: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
2130: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
2140: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
2150: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
2160: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
2170: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
2180: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
2190: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
21a0: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
21b0: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
2210: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2220: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
2230: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2240: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
2250: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
2260: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
2270: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2280: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2290: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
22a0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
22b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
22d0: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
22e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
22f0: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
2300: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2310: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_SIZE) * \.   
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
2350: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
2360: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
2370: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
2380: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
2390: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
23a0: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
23b0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
23c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23d0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
23e0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
23f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2400: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
2410: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2420: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
2430: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
2440: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
2450: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
2460: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
2470: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2480: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
2490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
24a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
24b0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
24c0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
24d0: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
24e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65  ./*.** The winMe
24f0: 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  mData structure 
2500: 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69  stores informati
2510: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74  on required by t
2520: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2530: 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d  c.** sqlite3_mem
2540: 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65  _methods impleme
2550: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  ntation..*/.type
2560: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65  def struct winMe
2570: 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61  mData winMemData
2580: 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  ;.struct winMemD
2590: 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ata {.#ifndef ND
25a0: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
25b0: 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  ;    /* Magic nu
25c0: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
25d0: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
25e0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ion. */.#endif. 
25f0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f   HANDLE hHeap; /
2600: 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20  * The handle to 
2610: 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42  our heap. */.  B
2620: 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20  OOL bOwned;  /* 
2630: 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65  Do we own the he
2640: 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79  ap (i.e. destroy
2650: 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29   it on shutdown)
2660: 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ? */.};..#ifndef
2670: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2680: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20  WINMEM_MAGIC    
2690: 20 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64   0x42b2830b.#end
26a0: 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  if..static struc
26b0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
26c0: 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69  _mem_data = {.#i
26d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57  fndef NDEBUG.  W
26e0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e  INMEM_MAGIC,.#en
26f0: 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53  dif.  NULL, FALS
2700: 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  E.};..#ifndef ND
2710: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e  EBUG.#define win
2720: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
2730: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2740: 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e  _data.magic==WIN
2750: 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73  MEM_MAGIC ).#els
2760: 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  e.#define winMem
2770: 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65  AssertMagic().#e
2780: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69  ndif..#define wi
2790: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77 69  nMemGetHeap() wi
27a0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70  n_mem_data.hHeap
27b0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ..static void *w
27c0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
27d0: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
27e0: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
27f0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73  void *pPrior);.s
2800: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
2810: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
2820: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
2830: 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  es);.static int 
2840: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
2850: 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  *p);.static int 
2860: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
2870: 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t n);.static int
2880: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
2890: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61   *pAppData);.sta
28a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
28b0: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
28c0: 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20  ppData);..const 
28d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
28e0: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
28f0: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23  etWin32(void);.#
2900: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2910: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
2920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2930: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
2940: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20   (normally) set 
2950: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63  once and never c
2960: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61  hanges.** therea
2970: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64  fter.  It record
2980: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70  s whether the op
2990: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
29a0: 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69  s Win9x.** or Wi
29b0: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20  nNT..**.** 0:   
29c0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
29d0: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20   unknown..** 1: 
29e0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
29f0: 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20  em is Win9x..** 
2a00: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  2:   Operating s
2a10: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a  ystem is WinNT..
2a20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74  **.** In order t
2a30: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73  o facilitate tes
2a40: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20  ting on a WinNT 
2a50: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74  system, the test
2a60: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20   fixture.** can 
2a70: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69  manually set thi
2a80: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20  s value to 1 to 
2a90: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65  emulate Win98 be
2aa0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65  havior..*/.#ifde
2ab0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ac0: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2ad0: 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  e = 0;.#else.sta
2ae0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
2af0: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e  os_type = 0;.#en
2b00: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53  dif..#ifndef SYS
2b10: 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53  CALL.#  define S
2b20: 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73  YSCALL sqlite3_s
2b30: 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69  yscall_ptr.#endi
2b40: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2b50: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
2b60: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
2b70: 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a  ws CE or WinRT..
2b80: 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
2b90: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
2ba0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64  TE_OS_WINRT.#  d
2bb0: 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41  efine osAreFileA
2bc0: 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20  pisANSI()       
2bd0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
2be0: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
2bf0: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
2c00: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
2c10: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
2c20: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
2c30: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
2c40: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
2c50: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
2c60: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
2c70: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
2c80: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
2c90: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
2ca0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
2cb0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
2cc0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
2cd0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
2ce0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2cf0: 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20   win_syscall {. 
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2d10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2d20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2d30: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2d40: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2d50: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2d60: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
2d70: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
2d80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2d90: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
2da0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
2db0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
2dc0: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
2dd0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2de0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2df0: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
2e00: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
2e10: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
2e20: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
2e30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2e40: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
2e50: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
2e60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2e80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
2e90: 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69  def osAreFileApi
2ea0: 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73  sANSI.#define os
2eb0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20  AreFileApisANSI 
2ec0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2ed0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30  VOID))aSyscall[0
2ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
2ef0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
2f00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
2f10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2f20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2f30: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
2f40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2f50: 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20  L)CharLowerW,   
2f60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2f70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c  #else.  { "CharL
2f80: 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  owerW",         
2f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2fc0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
2fd0: 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54  arLowerW ((LPWST
2fe0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
2ff0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  R))aSyscall[1].p
3000: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3010: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3030: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3040: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
3050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3060: 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65  SYSCALL)CharUppe
3070: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3080: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3090: 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20  "CharUpperW",   
30a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
30b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
30d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
30e0: 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28  e osCharUpperW (
30f0: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3100: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
3110: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
3120: 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65    { "CloseHandle
3130: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3140: 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e  SYSCALL)CloseHan
3150: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
3160: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3170: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42  sCloseHandle ((B
3180: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3190: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  DLE))aSyscall[3]
31a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
31b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
31c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
31d0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
31e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
31f0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3200: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
3210: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3220: 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20  CreateFileA",   
3230: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3240: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3260: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3270: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28   osCreateFileA (
3280: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3290: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57  (LPCSTR,DWORD,DW
32a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
32b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
32c0: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
32d0: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
32e0: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
32f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3300: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3310: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3320: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3330: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3340: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3350: 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20  reateFileW,     
3360: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3370: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3380: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3390: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
33c0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
33d0: 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28  eFileW ((HANDLE(
33e0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
33f0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
3400: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
3410: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
3420: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3440: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53  urrent)..#if (!S
3450: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3460: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3470: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3480: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34a0: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
34b0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
34c0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
34d0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
34e0: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
34f0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3500: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
3510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3540: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20  ateFileMappingA 
3560: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3570: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
3580: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
3590: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
35a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53  DWORD,DWORD,LPCS
35b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
35c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
35d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
35e0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
35f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3610: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
3620: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
3630: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20  TE_OMIT_WAL)).  
3640: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
3650: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
3660: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
3670: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
3680: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3690: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
36a0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
36b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
36c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
36d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36e0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
36f0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
3700: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
3710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3720: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
3730: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
3740: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
3750: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
3760: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3770: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3780: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3790: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
37a0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
37b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37c0: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
37d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37e0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
37f0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
3800: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3830: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3840: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
3850: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
3860: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3870: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
3880: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
3890: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
38a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
38b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
38c0: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
38d0: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
38e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
38f0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
3900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3910: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
3920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3960: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
3970: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
3980: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
3990: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
39a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
39b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
39c0: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
39d0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
39f0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3a10: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
3a20: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3a30: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3a60: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
3a70: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
3a80: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
3a90: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
3aa0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3ab0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
3ac0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3ad0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3ae0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
3af0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
3b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
3b10: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3b20: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
3b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3b50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
3b60: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3b70: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
3b80: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
3b90: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
3ba0: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
3bb0: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
3bc0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3bd0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
3be0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
3bf0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
3c00: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
3c10: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
3c20: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
3c30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
3c40: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
3c80: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3c90: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
3ca0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
3cb0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
3cc0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
3cd0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3ce0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
3cf0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
3d00: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
3d10: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
3d20: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3d30: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
3d40: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
3d50: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
3d60: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3d70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3d80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3d90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
3da0: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
3db0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3dc0: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
3dd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3de0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
3df0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
3e00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
3e40: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
3e50: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3e60: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
3e70: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3e80: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
3e90: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
3ea0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3eb0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3ec0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3ed0: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
3ee0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
3ef0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
3f00: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
3f10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3f20: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
3f30: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
3f40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3f70: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
3f80: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
3f90: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
3fa0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
3fb0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
3fc0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
3fd0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
3fe0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3ff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4000: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4010: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4020: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4030: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4040: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4060: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4080: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
40b0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
40c0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
40d0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
40e0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
40f0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4100: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4110: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4120: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4130: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4140: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4150: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4160: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4170: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4180: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4190: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
41a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
41b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
41c0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
41d0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
41e0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
41f0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4200: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4210: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4220: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4230: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4250: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4260: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4270: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4280: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4290: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
42a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
42b0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
42c0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
42d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
42e0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
42f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4310: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4320: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4330: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
4340: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
4350: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
4360: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4370: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
4380: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4390: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
43a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43b0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43c0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
43d0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
43e0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
43f0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4400: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4410: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4420: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
4430: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4440: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4450: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4460: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
4470: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4480: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
4490: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
44a0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
44b0: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
44c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
44e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
44f0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
4500: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
4510: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
4520: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
4530: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4550: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4560: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4570: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4580: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
4590: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
45a0: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
45b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
45c0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
45d0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
45e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4600: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4610: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
4620: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
4630: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
4640: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
4650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4660: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4670: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4680: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4690: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
46a0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
46b0: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
46c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
46d0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
46e0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
46f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4700: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4710: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4720: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4730: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
4740: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
4750: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
4760: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
4770: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
4780: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
4790: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
47a0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
47b0: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
47c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
47d0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
47e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
47f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
4800: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4810: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4840: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
4850: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
4860: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
4870: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
4880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4890: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
48a0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
48b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
48c0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
48d0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
48e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
48f0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
4900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4910: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4920: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
4930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4960: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
4970: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
4980: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4990: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
49a0: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
49b0: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
49c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
49d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
49e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
49f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4a00: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4a10: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
4a20: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
4a30: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
4a40: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
4a50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4a60: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4a70: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
4a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4ab0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
4ac0: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
4ad0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4ae0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
4af0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
4b00: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
4b10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4b20: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
4b30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4b40: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
4b50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
4b70: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
4b80: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4b90: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
4ba0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
4bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4bc0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
4bd0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4be0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
4bf0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
4c00: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
4c10: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
4c20: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
4c30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4c40: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4c50: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4c60: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
4c80: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
4c90: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
4ca0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
4cb0: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
4cc0: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
4cd0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
4ce0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
4cf0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4d00: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
4d10: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
4d20: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
4d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4d40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
4d50: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
4d60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4d90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4da0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
4db0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
4dc0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
4dd0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
4de0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4df0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4e00: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
4e10: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
4e20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4e30: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
4e40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e50: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
4e60: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
4e70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4ea0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
4eb0: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
4ec0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
4ed0: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
4ee0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
4ef0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
4f00: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
4f10: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
4f20: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
4f30: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f40: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
4f50: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
4f60: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
4f70: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
4f80: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4f90: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4fa0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
4fb0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
4fc0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
4fd0: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
4fe0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
4ff0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5000: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5030: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5040: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5050: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5060: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5070: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5080: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5090: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
50a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
50b0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
50c0: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
50d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
50e0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
50f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5100: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5110: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5120: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5150: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5160: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5170: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5180: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5190: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
51a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
51b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
51c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
51d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
51e0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
51f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5200: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5210: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5220: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5230: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5240: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5270: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5280: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5290: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
52a0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
52b0: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
52c0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
52d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
52e0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
52f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5300: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5320: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5330: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
5340: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5370: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
5380: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
5390: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
53a0: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
53b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
53c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
53d0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56  _ANSI).  { "GetV
53e0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
53f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5400: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5410: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5420: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5430: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5440: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5470: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
5480: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
5490: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
54a0: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
54b0: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
54c0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
54d0: 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20  { "HeapAlloc",  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
54f0: 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c  SCALL)HeapAlloc,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5510: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
5520: 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  eapAlloc ((LPVOI
5530: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
5540: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
5550: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
5560: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5570: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5580: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
5590: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
55a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
55b0: 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20  HeapCreate,     
55c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
55d0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65  lse.  { "HeapCre
55e0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
55f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5620: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5630: 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28  Create ((HANDLE(
5640: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53  WINAPI*)(DWORD,S
5650: 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20  IZE_T, \.       
5660: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5670: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
5680: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5690: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44  WINRT.  { "HeapD
56a0: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
56b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
56c0: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
56d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
56e0: 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  e.  { "HeapDestr
56f0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
5700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5730: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65  #define osHeapDe
5740: 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e  stroy ((BOOL(WIN
5750: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5760: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
5770: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46  ent)..  { "HeapF
5780: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
5790: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
57a0: 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  apFree,         
57b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
57c0: 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20  fine osHeapFree 
57d0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
57e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
57f0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38  OID))aSyscall[38
5800: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5810: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20   "HeapReAlloc", 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5830: 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63  CALL)HeapReAlloc
5840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5850: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5860: 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  apReAlloc ((LPVO
5870: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
5880: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  LE,DWORD,LPVOID,
5890: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
58a0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  T))aSyscall[39].
58b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
58c0: 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20  HeapSize",      
58d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
58e0: 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20  LL)HeapSize,    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5910: 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49  Size ((SIZE_T(WI
5920: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5930: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
5940: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
5950: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
5960: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5970: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61  INRT.  { "HeapVa
5980: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
5990: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
59a0: 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20  pValidate,      
59b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
59c0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
59d0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
59e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5a10: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c  define osHeapVal
5a20: 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e  idate ((BOOL(WIN
5a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5a40: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5a50: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
5a60: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
5a70: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5a80: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
5ac0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
5ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ae0: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
5af0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
5b10: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
5b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5b60: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
5b70: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
5b80: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
5b90: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5bb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5bc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5bd0: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
5be0: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
5bf0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5c00: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
5c10: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
5c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5c30: 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20  oadLibraryW,    
5c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5c50: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
5c60: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
5c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
5cb0: 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c  ibraryW ((HMODUL
5cc0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
5cd0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d  TR))aSyscall[43]
5ce0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5cf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5d00: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
5d10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d20: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72  (SYSCALL)LocalFr
5d30: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
5d40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5d50: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5d70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5d90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5da0: 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28  ne osLocalFree (
5db0: 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29  (HLOCAL(WINAPI*)
5dc0: 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c  (HLOCAL))aSyscal
5dd0: 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[44].pCurrent).
5de0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5df0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
5e00: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5e10: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
5e20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e30: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
5e40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
5e60: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5e70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5ea0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
5eb0: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
5ec0: 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  sLockFile ((BOOL
5ed0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5ee0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5ef0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
5f00: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  ORD))aSyscall[45
5f10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
5f20: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
5f30: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
5f40: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
5f50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5f60: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
5f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f80: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
5f90: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
5fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5fd0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
5fe0: 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20  kFileEx.#define 
5ff0: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  osLockFileEx ((B
6000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6010: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6020: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6030: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6040: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36  PED))aSyscall[46
6050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6060: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
6070: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
6080: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6090: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
60a0: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
60b0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
60c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60d0: 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  LL)MapViewOfFile
60e0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
60f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56  .#else.  { "MapV
6100: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6110: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6130: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6140: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d  dif..#define osM
6150: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
6160: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6170: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6180: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6190: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
61a0: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
61b0: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
61c0: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
61d0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
61e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
61f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6200: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
6210: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
6220: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
6230: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
6240: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
6250: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  nt))aSyscall[48]
6260: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6270: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
6280: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
6290: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
62a0: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
62b0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
62c0: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
62d0: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
62e0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
62f0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
6300: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
6310: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
6320: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
6330: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6340: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
6350: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6360: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
6370: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6380: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
6390: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
63a0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
63b0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
63c0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  50].pCurrent).. 
63d0: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
63e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
63f0: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
6400: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6410: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6420: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
6430: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6440: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  DLE))aSyscall[51
6450: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6460: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6470: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
6480: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6490: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
64a0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
64c0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
64d0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
64e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6500: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6510: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6520: 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e  nter ((DWORD(WIN
6530: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e  API*)(HANDLE,LON
6540: 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20  G,PLONG, \.     
6550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6560: 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[52].pCurrent)
6570: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6580: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65  _WINRT.  { "Slee
6590: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
65a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
65b0: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
65c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
65d0: 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  se.  { "Sleep", 
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6620: 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70  .#define osSleep
6630: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6640: 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  (DWORD))aSyscall
6650: 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [53].pCurrent)..
6660: 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54    { "SystemTimeT
6670: 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28  oFileTime",    (
6680: 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69  SYSCALL)SystemTi
6690: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20  meToFileTime,   
66a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
66b0: 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
66c0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
66d0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54  API*)(CONST SYST
66e0: 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  EMTIME*, \.     
66f0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
6700: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
6710: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6720: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
6730: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6740: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
6750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6760: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
6770: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6780: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6790: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
67a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
67d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
67e0: 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23  f osUnlockFile.#
67f0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
6800: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6810: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6820: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6830: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6840: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
6850: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6860: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6870: 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  CE.  { "UnlockFi
6880: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6890: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
68a0: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
68b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
68c0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
68d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
68e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6910: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
6920: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
6930: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6940: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6950: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6960: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
6970: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6980: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
6990: 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  E || !defined(SQ
69a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
69b0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
69c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
69d0: 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77  YSCALL)UnmapView
69e0: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
69f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a00: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
6a10: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
6a20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6a50: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
6a60: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6a70: 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73  *)(LPCVOID))aSys
6a80: 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e  call[57].pCurren
6a90: 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61  t)..  { "WideCha
6aa0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20  rToMultiByte",  
6ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65     (SYSCALL)Wide
6ac0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c  CharToMultiByte,
6ad0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6ae0: 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d  ne osWideCharToM
6af0: 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57  ultiByte ((int(W
6b00: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6b10: 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c  RD,LPCWSTR,int,L
6b20: 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20  PSTR,int, \.    
6b30: 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f      LPCSTR,LPBOO
6b40: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e  L))aSyscall[58].
6b50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6b60: 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20  WriteFile",     
6b70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b80: 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20  LL)WriteFile,   
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6ba0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ..#define osWrit
6bb0: 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eFile ((BOOL(WIN
6bc0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43  API*)(HANDLE,LPC
6bd0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
6be0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6bf0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
6c00: 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e  call[59].pCurren
6c10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6c20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
6c30: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
6c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6c50: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
6c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6c70: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
6c80: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
6c90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6cc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6cd0: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
6ce0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
6cf0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
6d00: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
6d10: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
6d20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  D))aSyscall[60].
6d30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6d40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6d50: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
6d60: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
6d70: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
6d80: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
6d90: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6da0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
6db0: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
6dc0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6de0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6df0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
6e00: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
6e10: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6e20: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
6e30: 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70  ))aSyscall[61].p
6e40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e60: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
6e70: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
6e80: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
6e90: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
6ea0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
6eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6ec0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
6ed0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ef0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6f00: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
6f10: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
6f20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6f30: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6f40: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
6f50: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
6f60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6f70: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
6f80: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
6f90: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
6fa0: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
6fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6fc0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
6fd0: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
6fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7010: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7020: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
7030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7040: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
7050: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
7060: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
7070: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
7080: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7090: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
70a0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
70b0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
70c0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
70d0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
70e0: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
70f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7100: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7110: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7140: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
7150: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7160: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7170: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
7180: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
7190: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
71a0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
71b0: 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72  Syscall[64].pCur
71c0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
71d0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
71e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
71f0: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70  IT_WAL).  { "Map
7200: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7210: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
7220: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
7230: 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65  mApp,    0 },.#e
7240: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
7250: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7260: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7290: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
72a0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
72b0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
72c0: 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c  *)(HANDLE,ULONG,
72d0: 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20  ULONG64, \.     
72e0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
72f0: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7300: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7310: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
7320: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7330: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
7340: 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20  reateFile2,     
7350: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7360: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
7370: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
7380: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
73b0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
73c0: 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28  eFile2 ((HANDLE(
73d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
73e0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
73f0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
7400: 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
7410: 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
7420: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
7430: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7440: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
7450: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7460: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
7470: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61  ION).  { "LoadPa
7480: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7490: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
74a0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
74b0: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
74c0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
74d0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
74e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7510: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
7520: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
7530: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
7540: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
7550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7560: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
7570: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7580: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
7590: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
75a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
75b0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
75c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
75d0: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
75e0: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
75f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7620: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
7630: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
7640: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
7650: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d  ID))aSyscall[68]
7660: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7680: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
7690: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
76a0: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
76b0: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
76c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
76d0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
76e0: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
76f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7720: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
7730: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
7740: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
7750: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
7760: 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70  ))aSyscall[69].p
7770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
7780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7790: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
77a0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
77b0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
77c0: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
77d0: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
77e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
77f0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7800: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7840: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7850: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
7860: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
7870: 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e  call[70].pCurren
7880: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
7890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
78a0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
78b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
78c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
78d0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
78e0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
78f0: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7900: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
7910: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7940: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
7950: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
7960: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
7970: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
7980: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  71].pCurrent).. 
7990: 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65   { "GetProcessHe
79a0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  ap",          (S
79b0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73  YSCALL)GetProces
79c0: 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20  sHeap,          
79d0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
79e0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
79f0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7a00: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
7a10: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
7a20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7a30: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
7a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
7a50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
7a60: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
7a70: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7a80: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
7a90: 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  p, 0 },.#else.  
7aa0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
7ab0: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
7ac0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7ae0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7af0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7b00: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28  MappingFromApp (
7b10: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7b20: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
7b30: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
7b40: 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55  TRIBUTES,ULONG,U
7b50: 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29  LONG64,LPCWSTR))
7b60: 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75  aSyscall[73].pCu
7b70: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
7b80: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
7b90: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
7ba0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
7bb0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
7bc0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
7bd0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
7be0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
7bf0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
7c00: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7c10: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
7c20: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
7c30: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
7c40: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
7c50: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
7c60: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
7c70: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
7c80: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
7c90: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
7ca0: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
7cb0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
7cc0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
7cd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
7ce0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
7cf0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7d00: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
7d10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7d20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
7d30: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
7d40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
7d50: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
7d60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
7d70: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
7d80: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
7d90: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
7da0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
7db0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
7dc0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7dd0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
7de0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
7df0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
7e00: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
7e10: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
7e20: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
7e30: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
7e40: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
7e50: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
7e60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
7e70: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7e80: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7e90: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
7eb0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
7ed0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7ee0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
7ef0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
7f00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7f10: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
7f20: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
7f30: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
7f40: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
7f50: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
7f60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
7f70: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7f80: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7f90: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7fb0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7fe0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7ff0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
8000: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8010: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
8020: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8030: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
8040: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8060: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8070: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8080: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8090: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
80a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
80b0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
80c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
80d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
80e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
80f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
8100: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
8110: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
8120: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
8130: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
8140: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
8150: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
8160: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
8170: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
8180: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8190: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
81a0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
81b0: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
81c0: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
81d0: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
81e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
81f0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
8200: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
8210: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8220: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
8230: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
8240: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
8250: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
8260: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
8270: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8280: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8290: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
82a0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
82b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
82c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
82e0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
82f0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
8300: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
8310: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
8320: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
8330: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
8340: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8350: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
8360: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
8370: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
8380: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
8390: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
83a0: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
83b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
83c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
83d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
83e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
83f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
8400: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
8410: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
8420: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
8430: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
8440: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
8450: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8460: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
8470: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
8480: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
8490: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
84a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
84b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
84c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
84d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
84e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
84f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
8500: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8510: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8520: 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63  outputs the spec
8530: 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72  ified (ANSI) str
8540: 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ing to the Win32
8550: 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66   debugger.** (if
8560: 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
8570: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69  .void sqlite3_wi
8580: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
8590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66  const char *zBuf
85a0: 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63  , int nBuf){.  c
85b0: 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49  har zDbgBuf[SQLI
85c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
85d0: 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d  _SIZE];.  int nM
85e0: 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28  in = MIN(nBuf, (
85f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8600: 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b  _BUF_SIZE - 1));
8610: 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74   /* may be negat
8620: 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d  ive. */.  if( nM
8630: 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d  in<-1 ) nMin = -
8640: 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69  1; /* all negati
8650: 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65  ve values become
8660: 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74   -1. */.  assert
8670: 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d  ( nMin==-1 || nM
8680: 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51  in==0 || nMin<SQ
8690: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
86a0: 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64  UF_SIZE );.#if d
86b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
86c0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
86d0: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
86e0: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
86f0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8700: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8710: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
8720: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
8730: 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65  ;.    osOutputDe
8740: 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42  bugStringA(zDbgB
8750: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
8760: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
8770: 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20  tringA(zBuf);.  
8780: 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  }.#elif defined(
8790: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
87a0: 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28  _WIDE).  memset(
87b0: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
87c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
87d0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f  _SIZE);.  if ( o
87e0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
87f0: 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20  Char(.          
8800: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
8810: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
8820: 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66  P_OEMCP, 0, zBuf
8830: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e  ,.          nMin
8840: 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75  , (LPWSTR)zDbgBu
8850: 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  f, SQLITE_WIN32_
8860: 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a  DBG_BUF_SIZE/siz
8870: 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29  eof(WCHAR))<=0 )
8880: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8890: 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75  }.  osOutputDebu
88a0: 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54  gStringW((LPCWST
88b0: 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73  R)zDbgBuf);.#els
88c0: 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29  e.  if( nMin>0 )
88d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62  {.    memset(zDb
88e0: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
88f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8900: 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ZE);.    memcpy(
8910: 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e  zDbgBuf, zBuf, n
8920: 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Min);.    fprint
8930: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
8940: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
8950: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
8960: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75  tderr, "%s", zBu
8970: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
8980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8990: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75  owing routine su
89a0: 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65  spends the curre
89b0: 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74  nt thread for at
89c0: 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c   least ms.** mil
89d0: 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73  liseconds.  This
89e0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
89f0: 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65  o the Win32 Slee
8a00: 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  p() interface..*
8a10: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
8a20: 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e  WINRT.static HAN
8a30: 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e  DLE sleepObj = N
8a40: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69  ULL;.#endif..voi
8a50: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
8a60: 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c  sleep(DWORD mill
8a70: 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53  iseconds){.#if S
8a80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8a90: 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d   if ( sleepObj==
8aa0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65  NULL ){.    slee
8ab0: 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45  pObj = osCreateE
8ac0: 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55  ventExW(NULL, NU
8ad0: 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54  LL, CREATE_EVENT
8ae0: 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20  _MANUAL_RESET,. 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8b10: 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d  YNCHRONIZE);.  }
8b20: 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70  .  assert( sleep
8b30: 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f  Obj!=NULL );.  o
8b40: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
8b50: 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c  jectEx(sleepObj,
8b60: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46   milliseconds, F
8b70: 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  ALSE);.#else.  o
8b80: 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f  sSleep(milliseco
8b90: 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  nds);.#endif.}..
8ba0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
8bb0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
8bc0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
8bd0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
8be0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
8bf0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
8c00: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
8c10: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
8c20: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
8c30: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
8c40: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
8c50: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
8c60: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
8c70: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
8c80: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
8c90: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
8ca0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
8cb0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
8cc0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
8cd0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
8ce0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
8cf0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
8d00: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8d10: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8d20: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
8d30: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
8d40: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
8d50: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
8d60: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
8d70: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
8d80: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
8d90: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
8da0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8db0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
8dc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65  TE_OS_WINRT.# de
8dd0: 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29  fine isNT()  (1)
8de0: 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28  .#elif !defined(
8df0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
8e00: 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20  _WIDE).# define 
8e10: 69 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  isNT()  (0).#els
8e20: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
8e30: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
8e40: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
8e50: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
8e60: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
8e70: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
8e80: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
8e90: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
8ea0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
8eb0: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
8ec0: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
8ed0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
8ee0: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
8ef0: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
8f00: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
8f10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
8f20: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
8f30: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ==2;.  }.#endif.
8f40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
8f50: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
8f60: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
8f70: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
8f80: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
8f90: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
8fa0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
8fb0: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
8fc0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
8fd0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
8fe0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
8ff0: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9000: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
9010: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
9020: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9030: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9040: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
9050: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
9060: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9070: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
9080: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9090: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
90a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
90b0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
90c0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
90d0: 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41  );.  p = osHeapA
90e0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
90f0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9100: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
9110: 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29  tes);.  if( !p )
9120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
9130: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
9140: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41  "failed to HeapA
9150: 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25  lloc %u bytes (%
9160: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
9180: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
9190: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
91a0: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
91b0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
91c0: 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  Free memory..*/.
91d0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
91e0: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
91f0: 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ior){.  HANDLE h
9200: 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  Heap;..  winMemA
9210: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9220: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9230: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
9240: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
9250: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9260: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9270: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
9280: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9290: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
92a0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
92b0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28  DATE).  assert (
92c0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
92d0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
92e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
92f0: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
9300: 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  f.  if( !pPrior 
9310: 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73  ) return; /* Pas
9320: 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61  sing NULL to Hea
9330: 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e  pFree is undefin
9340: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73  ed. */.  if( !os
9350: 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20  HeapFree(hHeap, 
9360: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9370: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
9380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9390: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
93a0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
93b0: 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28  pFree block %p (
93c0: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
93e0: 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74  Prior, osGetLast
93f0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
9400: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hHeap);.  }.}../
9410: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
9420: 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74  size of an exist
9430: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
9440: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
9450: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
9460: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
9470: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  , int nBytes){. 
9480: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
9490: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
94a0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
94b0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
94c0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
94d0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
94e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
94f0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
9500: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
9510: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9520: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9530: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
9540: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
9550: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
9560: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
9570: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9580: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
9590: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
95a0: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69  nBytes>=0 );.  i
95b0: 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20  f( !pPrior ){.  
95c0: 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f    p = osHeapAllo
95d0: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
95e0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
95f0: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
9600: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9610: 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f  p = osHeapReAllo
9620: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
9630: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9640: 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f  , pPrior, (SIZE_
9650: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20  T)nBytes);.  }. 
9660: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
9670: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9680: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
9690: 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20   to %s %u bytes 
96a0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65  pPrior ? "HeapRe
96d0: 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c  Alloc" : "HeapAl
96e0: 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73  loc", nBytes, os
96f0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
9730: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9740: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75  he size of an ou
9750: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
9760: 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a  tion, in bytes..
9770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
9780: 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70  nMemSize(void *p
9790: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
97a0: 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a  p;.  SIZE_T n;..
97b0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
97c0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
97d0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
97e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
97f0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9800: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
9810: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
9820: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
9830: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
9840: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
9850: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
9860: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
9870: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
9880: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9890: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
98a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
98b0: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
98c0: 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68  n = osHeapSize(h
98d0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
98e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
98f0: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a  );.  if( n==(SIZ
9900: 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71  E_T)-1 ){.    sq
9910: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9920: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
9930: 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63  to HeapSize bloc
9940: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
9950: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9960: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
9970: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
9980: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
9990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
99a0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
99b0: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
99c0: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
99d0: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
99e0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
99f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
9a00: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
9a10: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
9a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
9a30: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
9a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9a50: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
9a60: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
9a70: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
9a80: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
9a90: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
9aa0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9ab0: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
9ac0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
9ad0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
9ae0: 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  >magic==WINMEM_M
9af0: 41 47 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51  AGIC );..#if !SQ
9b00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9b10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9b20: 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20  AP_CREATE.  if( 
9b30: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
9b40: 65 61 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d  eap ){.    pWinM
9b50: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
9b60: 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c  osHeapCreate(SQL
9b70: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9b80: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
9bb0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
9bc0: 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  IT_SIZE,.       
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
9bf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9c00: 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _MAX_SIZE);.    
9c10: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
9c20: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
9c30: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9c40: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
9c50: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
9c60: 48 65 61 70 43 72 65 61 74 65 20 28 25 64 29 2c  HeapCreate (%d),
9c70: 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53   flags=%u, initS
9c80: 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d  ize=%u, maxSize=
9c90: 25 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f  %u",.          o
9ca0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
9cb0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9cc0: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
9cd0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
9ce0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c  _HEAP_INIT_SIZE,
9cf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9d00: 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20  AP_MAX_SIZE);.  
9d10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
9d30: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
9d40: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20  bOwned = TRUE;. 
9d50: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
9d60: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
9d70: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57  ;.  }.#else.  pW
9d80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9d90: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48   = osGetProcessH
9da0: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57  eap();.  if( !pW
9db0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9dc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9dd0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9de0: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65  ,.        "faile
9df0: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48  d to GetProcessH
9e00: 65 61 70 20 28 25 64 29 22 2c 20 6f 73 47 65 74  eap (%d)", osGet
9e10: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
9e20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e30: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69  NOMEM;.  }.  pWi
9e40: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
9e50: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65   = FALSE;.  asse
9e60: 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  rt( !pWinMemData
9e70: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64  ->bOwned );.#end
9e80: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  if.  assert( pWi
9e90: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
9ea0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9eb0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9ec0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
9ed0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
9ee0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9ef0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9f00: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
9f10: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
9f20: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
9f30: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
9f40: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9f50: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9f60: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
9f70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9f80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69  OK;.}../*.** Dei
9f90: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
9fa0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
9fb0: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
9fc0: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
9fd0: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
9fe0: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
9ff0: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
a000: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
a010: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
a020: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57  return;.  if( pW
a030: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
a040: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a050: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
a060: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a070: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a080: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
a090: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a0a0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
a0b0: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
a0c0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
a0d0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
a0e0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
a0f0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
a100: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
a110: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
a120: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
a130: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
a140: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
a150: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
a160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a170: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
a180: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
a190: 61 70 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20  apDestroy (%d), 
a1a0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
a1c0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
a1d0: 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61  (void*)pWinMemDa
a1e0: 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20  ta->hHeap);.    
a1f0: 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65    }.      pWinMe
a200: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
a210: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
a220: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
a230: 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  eap = NULL;.  }.
a240: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
a250: 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20  e the low-level 
a260: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
a270: 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  n function point
a280: 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  ers in.** sqlite
a290: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
a2a0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
a2b0: 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e   the routines in
a2c0: 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a   this file. The.
a2d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65  ** arguments spe
a2e0: 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f  cify the block o
a2f0: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61  f memory to mana
a300: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ge..**.** This r
a310: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
a320: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
a330: 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74  _config(), and t
a340: 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e  herefore.** is n
a350: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62  ot required to b
a360: 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74  e threadsafe (it
a370: 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e   is not)..*/.con
a380: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
a390: 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d  ethods *sqlite3M
a3a0: 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29  emGetWin32(void)
a3b0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
a3c0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
a3d0: 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f  hods winMemMetho
a3e0: 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65  ds = {.    winMe
a3f0: 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e  mMalloc,.    win
a400: 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e  MemFree,.    win
a410: 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20  MemRealloc,.    
a420: 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20  winMemSize,.    
a430: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20  winMemRoundup,. 
a440: 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20     winMemInit,. 
a450: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a460: 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f  n,.    &win_mem_
a470: 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75  data.  };.  retu
a480: 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  rn &winMemMethod
a490: 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74  s;.}..void sqlit
a4a0: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
a4b0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
a4c0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
a4d0: 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71  ONFIG_MALLOC, sq
a4e0: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
a4f0: 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ());.}.#endif /*
a500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
a510: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LLOC */../*.** C
a520: 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73  onvert a UTF-8 s
a530: 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f  tring to Microso
a540: 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d  ft Unicode (UTF-
a550: 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61  16?). .**.** Spa
a560: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
a570: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
a580: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
a590: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
a5a0: 63 20 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55  c LPWSTR utf8ToU
a5b0: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
a5c0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
a5d0: 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50   int nChar;.  LP
a5e0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
a5f0: 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f  me;..  nChar = o
a600: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
a610: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
a620: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
a630: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20  NULL, 0);.  if( 
a640: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
a650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a660: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
a670: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
a680: 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  o( nChar*sizeof(
a690: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
a6a0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
a6b0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
a6c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a6d0: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
a6e0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
a6f0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
a700: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
a710: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
a740: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
a750: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a760: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
a770: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
a780: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
a790: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
a7a0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
a7b0: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
a7c0: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
a7d0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
a7e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a7f0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
a800: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
a810: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
a820: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
a830: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
a840: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
a850: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
a860: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
a870: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
a880: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
a890: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
a8a0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a8b0: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
a8c0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
a8d0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
a8e0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
a8f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
a900: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
a910: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
a920: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a930: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
a940: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
a950: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
a960: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
a970: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
a980: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
a9b0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
a9c0: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
a9d0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
a9e0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
a9f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
aa00: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
aa10: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
aa20: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f  n ANSI string to
aa30: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
aa40: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
aa50: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
aa60: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
aa70: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r file apis..** 
aa80: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
aa90: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
aaa0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
aab0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
aac0: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
aad0: 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54  tic LPWSTR mbcsT
aae0: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
aaf0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
ab00: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
ab10: 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65  LPWSTR zMbcsFile
ab20: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
ab30: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
ab40: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
ab50: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
ab60: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
ab70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
ab80: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
ab90: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
aba0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48     0)*sizeof(WCH
abd0: 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  AR);.  if( nByte
abe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
abf0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73  n 0;.  }.  zMbcs
ac00: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
ac10: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
ac20: 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73  yte*sizeof(zMbcs
ac30: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
ac40: 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e    if( zMbcsFilen
ac50: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
ac60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
ac70: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
ac80: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
ac90: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
aca0: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
acb0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
ace0: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
acf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ad00: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
ad10: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
ad20: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
ad30: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
ad40: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
ad50: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
ad60: 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  Unicode to multi
ad70: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
ad80: 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e  string, based on
ad90: 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41   the.** user's A
ada0: 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  NSI codepage..**
adb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
adc0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
add0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
ade0: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
adf0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
ae00: 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63  tatic char *unic
ae10: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54  odeToMbcs(LPCWST
ae20: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
ae30: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
ae40: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ae50: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
ae60: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
ae70: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
ae80: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
ae90: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
aea0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
aeb0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
aec0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
aed0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
aee0: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
aef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
af00: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
af10: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
af20: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
af30: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zFilename==0 ){.
af40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
af50: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
af60: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
af70: 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  e(codepage, 0, z
af80: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
af90: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
afc0: 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  te, 0, 0);.  if(
afd0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
afe0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aff0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
b000: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
b010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
b020: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
b030: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
b040: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
b050: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
b060: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
b070: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
b080: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
b090: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
b0a0: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
b0b0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
b0c0: 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20  s_to_utf8(const 
b0d0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
b0e0: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
b0f0: 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54  ameUtf8;.  LPWST
b100: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
b110: 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f  TmpWide = mbcsTo
b120: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
b130: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
b140: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
b150: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
b160: 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69  lenameUtf8 = uni
b170: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57  codeToUtf8(zTmpW
b180: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
b190: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
b1a0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
b1b0: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
b1c0: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
b1d0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
b1e0: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
b1f0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
b200: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
b210: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
b220: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
b230: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
b240: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
b250: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
b260: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
b270: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
b280: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
b290: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
b2a0: 20 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38   zTmpWide = utf8
b2b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
b2c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
b2d0: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
b2e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
b2f0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75  FilenameMbcs = u
b300: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
b310: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
b320: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
b330: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
b340: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  nameMbcs;.}../*.
b350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b360: 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64   sets the data d
b370: 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20  irectory or the 
b380: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
b390: 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ory based on.** 
b3a0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67  the provided arg
b3b0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70  uments.  The typ
b3c0: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
b3d0: 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f  be 1 in order to
b3e0: 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   set the.** data
b3f0: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20   directory or 2 
b400: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
b410: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
b420: 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56  rectory.  The zV
b430: 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  alue.** argument
b440: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b450: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
b460: 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72   use.  The retur
b470: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a  n value will be.
b480: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
b490: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69  successful..*/.i
b4a0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b4b0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44  _set_directory(D
b4c0: 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53  WORD type, LPCWS
b4d0: 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  TR zValue){.  ch
b4e0: 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79  ar **ppDirectory
b4f0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
b500: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b510: 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  IT.  int rc = sq
b520: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
b530: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
b540: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
b550: 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  .  if( type==SQL
b560: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
b570: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
b580: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
b590: 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61   = &sqlite3_data
b5a0: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65  _directory;.  }e
b5b0: 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51  lse if( type==SQ
b5c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
b5d0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
b5e0: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
b5f0: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d  y = &sqlite3_tem
b600: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  p_directory;.  }
b610: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
b620: 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d  rectory || type=
b630: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
b640: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
b650: 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  E.          || t
b660: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
b670: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
b680: 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73  _TYPE.  );.  ass
b690: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
b6a0: 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  y || sqlite3Memd
b6b0: 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44  ebugHasType(*ppD
b6c0: 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50  irectory, MEMTYP
b6d0: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28  E_HEAP) );.  if(
b6e0: 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a   ppDirectory ){.
b6f0: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65      char *zValue
b700: 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66  Utf8 = 0;.    if
b710: 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c  ( zValue && zVal
b720: 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  ue[0] ){.      z
b730: 56 61 6c 75 65 55 74 66 38 20 3d 20 75 6e 69 63  ValueUtf8 = unic
b740: 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65  odeToUtf8(zValue
b750: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56  );.      if ( zV
b760: 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20  alueUtf8==0 ){. 
b770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b780: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
b7a0: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69  lite3_free(*ppDi
b7b0: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70  rectory);.    *p
b7c0: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61  pDirectory = zVa
b7d0: 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74  lueUtf8;.    ret
b7e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b7f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b800: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
b810: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
b820: 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72  lue of getLastEr
b830: 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72  rorMsg.** is zer
b840: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
b850: 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
b860: 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
b870: 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
b880: 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
b890: 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
b8a0: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
b8b0: 74 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  t getLastErrorMs
b8c0: 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e  g(DWORD lastErrn
b8d0: 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  o, int nBuf, cha
b8e0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46  r *zBuf){.  /* F
b8f0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74  ormatMessage ret
b900: 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72  urns 0 on failur
b910: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74  e.  Otherwise it
b920: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68  .  ** returns th
b930: 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41  e number of TCHA
b940: 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  Rs written to th
b950: 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75  e output.  ** bu
b960: 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20  ffer, excluding 
b970: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  the terminating 
b980: 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a  null char..  */.
b990: 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20    DWORD dwLen = 
b9a0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  0;.  char *zOut 
b9b0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54  = 0;..  if( isNT
b9c0: 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
b9d0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43  _OS_WINRT.    WC
b9e0: 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51  HAR zTempWide[SQ
b9f0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
ba00: 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a  RRMSG_CHARS+1];.
ba10: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
ba20: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
ba30: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
ba40: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
ba70: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
ba80: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
bad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
baf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
bb10: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
bb40: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
bb50: 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ARS,.           
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20    0);.#else.    
bb80: 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65  LPWSTR zTempWide
bb90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
bba0: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
bbb0: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
bbc0: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
bbd0: 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20  FFER |.         
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
bc00: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
bc30: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
bc40: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
bc90: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a       (LPWSTR) &z
bce0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69         0);.#endi
bd30: 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  f.    if( dwLen 
bd40: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
bd50: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
bd60: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
bd70: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
bd80: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
bd90: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
bda0: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
bdb0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
bdc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
bdd0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
bde0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bdf0: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
be00: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
be10: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
be20: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
be30: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
be40: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
be50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
be60: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
be70: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
be80: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
be90: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
bea0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
beb0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
bec0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
bed0: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
bf00: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
bf10: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
bf40: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
bf50: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
bfe0: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
c030: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
c040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
c050: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
c060: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
c070: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
c080: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
c090: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
c0a0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
c0b0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
c0c0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
c0d0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
c0e0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
c0f0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
c100: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
c110: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
c120: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
c130: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
c140: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
c150: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
c160: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c170: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
c180: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
c190: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74  %lx (%lu)", last
c1a0: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f  Errno, lastErrno
c1b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c1c0: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
c1d0: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
c1e0: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
c1f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
c200: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
c210: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
c220: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
c230: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
c240: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c250: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
c260: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c270: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c280: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  on - winLogError
c290: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e  AtLine() - is on
c2a0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
c2b0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
c2c0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  winLogError()..*
c2d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c2e0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  e is invoked aft
c2f0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
c300: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
c310: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73  tion..** It logs
c320: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
c330: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
c340: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
c350: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
c360: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
c370: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
c380: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
c390: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
c3a0: 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73  m .** FormatMess
c3b0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
c3c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
c3d0: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
c3e0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
c3f0: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
c400: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
c410: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
c420: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
c430: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
c440: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
c450: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
c460: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
c470: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
c480: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
c490: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
c4a0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
c4b0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
c4c0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
c4d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
c4e0: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
c4f0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
c500: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
c510: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
c520: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
c530: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
c560: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
c570: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c590: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
c5a0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
c5b0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
c5c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
c5d0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
c5e0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
c5f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
c600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c610: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
c620: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
c630: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
c660: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
c670: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
c680: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
c690: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
c6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
c6b0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
c6c0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
c6d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c6f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
c700: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
c710: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
c720: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
c730: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
c740: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
c750: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
c760: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
c770: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
c780: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
c790: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
c7a0: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
c7b0: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
c7c0: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
c7d0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
c7e0: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
c7f0: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
c800: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
c810: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
c820: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
c830: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
c840: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
c850: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
c860: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
c870: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
c880: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
c890: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
c8a0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
c8b0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
c8c0: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
c8d0: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
c8e0: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
c8f0: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
c900: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
c910: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
c920: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
c930: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
c940: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
c950: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
c960: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
c970: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
c980: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
c990: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
c9a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
c9b0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c9c0: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
c9d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
c9e0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
c9f0: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
ca00: 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f  atic int win32Io
ca10: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
ca20: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
ca30: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
ca40: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
ca50: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
ca60: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ca70: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  DELAY;../*.** If
ca80: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
ca90: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
caa0: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
cab0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
cac0: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
cad0: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
cae0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
caf0: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
cb00: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
cb10: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
cb20: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
cb30: 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74  t retryIoerr(int
cb40: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
cb50: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
cb60: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
cb70: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
cb80: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f  pnRetry>=win32Io
cb90: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
cba0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
cbb0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
cbc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
cbd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  n 0;.  }.  if( e
cbe0: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
cbf0: 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65  ENIED ||.      e
cc00: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
cc10: 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20  LATION ||.      
cc20: 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  e==ERROR_SHARING
cc30: 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20  _VIOLATION ){.  
cc40: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
cc50: 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  sleep(win32Ioerr
cc60: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
cc70: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
cc80: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
cc90: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
cca0: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
ccb0: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
ccc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ccd0: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
cce0: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
ccf0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
cd00: 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74  oid logIoerr(int
cd10: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20   nRetry){.  if( 
cd20: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
cd30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
cd40: 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22  _IOERR, .      "
cd50: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
cd60: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
cd70: 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77  nflict",.      w
cd80: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
cd90: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
cda0: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
cdb0: 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45   }.}..#if SQLITE
cdc0: 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a  _OS_WINCE./*****
cdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce10: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
ce20: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
ce30: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
ce40: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
ce50: 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  ed(SQLITE_MSVC_L
ce60: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c  OCALTIME_API) ||
ce70: 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f   !SQLITE_MSVC_LO
ce80: 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a  CALTIME_API./*.*
ce90: 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f  * The MSVC CRT o
cea0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79  n Windows CE may
ceb0: 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
cec0: 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
ced0: 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20  .  So.** create 
cee0: 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
cef0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
cf00: 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f  h>.struct tm *__
cf10: 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28  cdecl localtime(
cf20: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29  const time_t *t)
cf30: 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  .{.  static stru
cf40: 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54  ct tm y;.  FILET
cf50: 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20  IME uTm, lTm;.  
cf60: 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a  SYSTEMTIME pTm;.
cf70: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
cf80: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
cf90: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
cfa0: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
cfb0: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
cfc0: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57  owDateTime = (DW
cfd0: 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46  ORD)(t64 & 0xFFF
cfe0: 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77  FFFFF);.  uTm.dw
cff0: 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44  HighDateTime= (D
d000: 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29  WORD)(t64 >> 32)
d010: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
d020: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
d030: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69  Tm,&lTm);.  osFi
d040: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
d050: 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20  me(&lTm,&pTm);. 
d060: 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d   y.tm_year = pTm
d070: 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20  .wYear - 1900;. 
d080: 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e   y.tm_mon = pTm.
d090: 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e  wMonth - 1;.  y.
d0a0: 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_wday = pTm.wD
d0b0: 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d  ayOfWeek;.  y.tm
d0c0: 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _mday = pTm.wDay
d0d0: 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20  ;.  y.tm_hour = 
d0e0: 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74  pTm.wHour;.  y.t
d0f0: 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e  m_min = pTm.wMin
d100: 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20  ute;.  y.tm_sec 
d110: 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20  = pTm.wSecond;. 
d120: 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65   return &y;.}.#e
d130: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41  ndif..#define HA
d140: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
d150: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
d160: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
d170: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
d180: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
d190: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
d1a0: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
d1b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
d1c0: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
d1d0: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
d1e0: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
d1f0: 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69     dwErr = osWai
d200: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
d210: 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  (h, INFINITE);. 
d220: 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72    } while (dwErr
d230: 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f   != WAIT_OBJECT_
d240: 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41  0 && dwErr != WA
d250: 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d  IT_ABANDONED);.}
d260: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d270: 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62   lock acquired b
d280: 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  y winceMutexAcqu
d290: 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ire().*/.#define
d2a0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
d2b0: 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74  se(h) ReleaseMut
d2c0: 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ex(h)../*.** Cre
d2d0: 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
d2e0: 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  d shared memory 
d2f0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
d300: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
d310: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
d320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d330: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
d340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d350: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
d360: 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20  File){.  LPWSTR 
d370: 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a  zTok;.  LPWSTR z
d380: 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61  Name;.  DWORD la
d390: 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20  stErrno;.  BOOL 
d3a0: 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b  bLogged = FALSE;
d3b0: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
d3c0: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
d3d0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
d3e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
d3f0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
d400: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
d410: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
d420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
d430: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
d440: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
d450: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
d460: 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
d470: 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
d480: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
d490: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
d4a0: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
d4b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
d4c0: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
d4d0: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
d4e0: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
d4f0: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
d500: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
d510: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
d520: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
d530: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
d540: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
d550: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
d560: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
d570: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
d580: 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
d590: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
d5a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
d5b0: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
d5c0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
d5d0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
d5e0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69  tError();.    wi
d5f0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
d600: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
d610: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d620: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
d630: 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46  CreateLock1", zF
d640: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ilename);.    sq
d650: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
d660: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d670: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
d680: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
d690: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
d6a0: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
d6b0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
d6c0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d6d0: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
d6e0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
d6f0: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
d700: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
d710: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
d720: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
d730: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
d740: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
d750: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
d760: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
d770: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
d780: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
d790: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
d7a0: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
d7b0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
d7c0: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
d7d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
d7e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
d7f0: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
d830: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
d840: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
d880: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
d890: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
d8a0: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
d8b0: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
d8c0: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
d8d0: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
d8e0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45  lized */.  lastE
d8f0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
d900: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c  Error();.  if (l
d910: 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f  astErrno == ERRO
d920: 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53  R_ALREADY_EXISTS
d930: 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46  ){.    bInit = F
d940: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ALSE;.  }..  sql
d950: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
d960: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
d970: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
d980: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
d990: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
d9a0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  it. */.  if( pFi
d9b0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20  le->hShared ){. 
d9c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d9d0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
d9e0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
d9f0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
da10: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
da20: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
da30: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
da40: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
da50: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
da60: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
da70: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
da80: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
da90: 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68    if( !pFile->sh
daa0: 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46  ared ){.      pF
dab0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dac0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
dad0: 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  );.      winLogE
dae0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
daf0: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
db00: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
db10: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
db20: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
db30: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
db40: 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
db50: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
db60: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
db70: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
db80: 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
db90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
dba0: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
dbb0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
dbc0: 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
dbd0: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
dbe0: 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ail */.  if( pFi
dbf0: 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c  le->hShared==NUL
dc00: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c  L ){.    if( !bL
dc10: 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ogged ){.      p
dc20: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
dc30: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
dc40: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
dc50: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
dc60: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
dc90: 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k3", zFilename);
dca0: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
dcb0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20   TRUE;.    }.   
dcc0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
dcd0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
dce0: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
dcf0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
dd00: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
dd10: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
dd20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd30: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20  _IOERR;.  }.  . 
dd40: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
dd50: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
dd60: 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
dd70: 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
dd80: 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
dd90: 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
dda0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
ddb0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
ddc0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
ddd0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
dde0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ddf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
de00: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
de10: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
de20: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
de30: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
de40: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
de50: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
de60: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
de70: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
de80: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
de90: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
dea0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
deb0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
dec0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
ded0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
dee0: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
def0: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
df00: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
df10: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
df20: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
df30: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
df40: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
df50: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
df60: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
df70: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
df80: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
df90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
dfa0: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
dfb0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
dfc0: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
dfd0: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
dfe0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
dff0: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
e000: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e010: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
e020: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
e030: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
e040: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
e050: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e060: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
e070: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
e080: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
e090: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
e0a0: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
e0b0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
e0c0: 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
e0d0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
e0e0: 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
e0f0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
e100: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
e110: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
e120: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
e130: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
e140: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
e150: 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61    .    osCloseHa
e160: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
e170: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
e180: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
e190: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20   }.}../* .** An 
e1a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
e1b0: 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
e1c0: 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
e1d0: 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
e1e0: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
e1f0: 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
e200: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
e210: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
e220: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
e230: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
e240: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
e250: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
e260: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
e270: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
e280: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
e290: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
e2a0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
e2b0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
e2c0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
e2d0: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
e2e0: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
e2f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e300: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e310: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
e320: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
e330: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
e340: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
e350: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
e360: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
e370: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e380: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
e390: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e3a0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
e3b0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
e3c0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e3d0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e3e0: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
e3f0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
e400: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
e410: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
e420: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
e430: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
e440: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
e450: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
e460: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
e470: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
e480: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
e490: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e4a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
e4b0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
e4c0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
e4d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
e4e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
e4f0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
e500: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
e510: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
e520: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
e530: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
e540: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
e550: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e560: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
e570: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
e580: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
e590: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
e5a0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
e5b0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
e5c0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
e5d0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e5e0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
e5f0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
e600: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
e610: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
e620: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
e630: 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
e640: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e650: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
e660: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
e670: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
e680: 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
e690: 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
e6a0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
e6b0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e6c0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
e6d0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
e6e0: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
e6f0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e700: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
e710: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e720: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e730: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
e740: 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
e750: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
e760: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
e770: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
e780: 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
e790: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
e7a0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
e7b0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e7c0: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
e7d0: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
e7e0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e7f0: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
e800: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e810: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
e820: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
e830: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e840: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
e850: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
e860: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
e870: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
e880: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
e890: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
e8a0: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
e8b0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
e8c0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
e8d0: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
e8e0: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
e8f0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
e900: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
e910: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
e920: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
e930: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e940: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
e950: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e960: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
e970: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
e980: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
e990: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
e9a0: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
e9b0: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
e9c0: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
e9d0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
e9e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
e9f0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
ea00: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ea10: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
ea20: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
ea30: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ea40: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
ea50: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
ea60: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
ea70: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
ea80: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
ea90: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
eaa0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
eab0: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
eac0: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
ead0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
eae0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
eaf0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
eb00: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
eb10: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
eb20: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
eb30: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
eb40: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
eb50: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
eb60: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
eb70: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
eb80: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
eb90: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
eba0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
ebb0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
ebc0: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
ebd0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
ebe0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
ebf0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
ec00: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
ec10: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ec20: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
ec30: 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20  SHARED_SIZE.    
ec40: 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d           || nNum
ec50: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ec60: 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
ec70: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
ec80: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
ec90: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
eca0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
ecb0: 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
ecc0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
ecd0: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
ece0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
ecf0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ed00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
ed10: 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
ed20: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
ed30: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
ed40: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
ed50: 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
ed60: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
ed70: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
ed80: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
ed90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
eda0: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
edb0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
edc0: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
edd0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
ede0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
edf0: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
ee00: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
ee10: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
ee20: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
ee30: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
ee40: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
ee50: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
ee60: 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
ee70: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
ee80: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
ee90: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
eea0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
eeb0: 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
eec0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
eed0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
eee0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
eef0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
ef00: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
ef10: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
ef20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
ef30: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
ef40: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
ef50: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
ef60: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
ef70: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
ef80: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
efe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
eff0: 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
f000: 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
f010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
f020: 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
f030: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
f040: 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
f050: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
f060: 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
f070: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
f080: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
f090: 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
f0a0: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
f0b0: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
f0c0: 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
f0d0: 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
f0e0: 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
f0f0: 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
f100: 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
f110: 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
f120: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
f130: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
f140: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
f150: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
f180: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
f190: 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54  #else.  if( isNT
f1a0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
f1b0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
f1c0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
f1d0: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
f1e0: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
f1f0: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
f200: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
f210: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
f220: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
f230: 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
f240: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
f250: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
f260: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
f270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f280: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
f290: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
f2a0: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
f2b0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
f2e0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
f2f0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
f300: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
f310: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
f320: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
f330: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
f340: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
f350: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
f360: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
f370: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
f380: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
f390: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
f3a0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
f3b0: 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
f3c0: 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
f3d0: 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
f3e0: 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
f3f0: 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
f400: 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
f410: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
f420: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
f430: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
f440: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
f470: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
f480: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
f490: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f   isNT() ){.    O
f4a0: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
f4b0: 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
f4c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
f4d0: 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
f4e0: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
f4f0: 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
f500: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
f510: 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
f520: 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
f530: 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e  Ex(*phFile, 0, n
f540: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
f550: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
f560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f570: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
f580: 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
f590: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
f5a0: 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
f5d0: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
f5e0: 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f.}../**********
f5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f630: 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
f640: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
f650: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
f660: 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
f670: 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
f680: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
f690: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
f6f0: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
f700: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
f710: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
f720: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
f730: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
f740: 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
f750: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
f760: 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
f770: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
f780: 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
f790: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
f7a0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
f7b0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
f7c0: 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  t .** argument t
f7d0: 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74  o offset iOffset
f7e0: 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65   within the file
f7f0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
f800: 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f   return 0. .** O
f810: 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46  therwise, set pF
f820: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61  ile->lastErrno a
f830: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
f840: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
f850: 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69  t seekWinFile(wi
f860: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  nFile *pFile, sq
f870: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
f880: 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  set){.#if !SQLIT
f890: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e  E_OS_WINRT.  LON
f8a0: 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20  G upperBits;    
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8c0: 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74  Most sig. 32 bit
f8d0: 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20  s of new offset 
f8e0: 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  */.  LONG lowerB
f8f0: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
f900: 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69       /* Least si
f910: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
f920: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57  w offset */.  DW
f930: 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20  ORD dwRet;      
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f950: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
f960: 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  by SetFilePointe
f970: 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  r() */.  DWORD l
f980: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f9a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
f9b0: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
f9c0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
f9d0: 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65  K file=%p, offse
f9e0: 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65  t=%lld\n", pFile
f9f0: 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a  ->h, iOffset));.
fa00: 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  .  upperBits = (
fa10: 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e  LONG)((iOffset>>
fa20: 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
fa30: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
fa40: 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20   (LONG)(iOffset 
fa50: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a  & 0xffffffff);..
fa60: 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a    /* API oddity:
fa70: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
fa80: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
fa90: 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64   returns a dword
faa0: 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e   .  ** containin
fab0: 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62  g the lower 32-b
fac0: 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66  its of the new f
fad0: 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20  ile-offset. Or, 
fae0: 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a  if it fails,.  *
faf0: 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56  * it returns INV
fb00: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
fb10: 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61  INTER. However a
fb20: 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e  ccording to MSDN
fb30: 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f  , .  ** INVALID_
fb40: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
fb50: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76   may also be a v
fb60: 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e  alid new offset.
fb70: 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65   So to determine
fb80: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61   .  ** whether a
fb90: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
fba0: 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
fbb0: 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
fbc0: 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a  ary to call .  *
fbd0: 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
fbe0: 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d  ..  */.  dwRet =
fbf0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
fc00: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
fc10: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
fc20: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
fc30: 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
fc40: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
fc50: 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26  POINTER.      &&
fc60: 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
fc70: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
fc80: 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a  !=NO_ERROR)) ){.
fc90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
fca0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
fcb0: 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
fcc0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
fcd0: 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
fce0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
fcf0: 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65      "seekWinFile
fd00: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
fd10: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
fd20: 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
fd30: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  =SQLITE_IOERR_SE
fd40: 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  EK\n", pFile->h)
fd50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
fd60: 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
fd70: 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
fd80: 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
fd90: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
fda0: 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20  eturn 0;.#else. 
fdb0: 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73   /*.  ** Same as
fdc0: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
fdd0: 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  hat this impleme
fde0: 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f  ntation works fo
fdf0: 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20  r WinRT..  */.. 
fe00: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78   LARGE_INTEGER x
fe10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe20: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73   /* The new offs
fe30: 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  et */.  BOOL bRe
fe40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
fe50: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
fe60: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
fe70: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20  FilePointerEx() 
fe80: 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74  */..  x.QuadPart
fe90: 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52   = iOffset;.  bR
fea0: 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
feb0: 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68  interEx(pFile->h
fec0: 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47  , x, 0, FILE_BEG
fed0: 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74  IN);..  if(!bRet
fee0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
fef0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
ff00: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
ff10: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
ff20: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
ff30: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
ff40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73  .             "s
ff50: 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69  eekWinFile", pFi
ff60: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
ff70: 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
ff80: 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
ff90: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
ffa0: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
ffb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
ffc0: 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
ffd0: 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
ffe0: 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
fff0: 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
10000 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  0;.#endif.}..#if
10010 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10020 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61  _SIZE>0./* Forwa
10030 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
10040 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
10050 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
10060 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  mapfile(winFile*
10070 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
10080 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
10090 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72  *.** It is repor
100a0 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65  ted that an atte
100b0 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68  mpt to close a h
100c0 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65  andle might some
100d0 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20  times.** fail.  
100e0 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75  This is a very u
100f0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75  nreasonable resu
10100 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20  lt, but Windows 
10110 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20  is notorious.** 
10120 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73  for being unreas
10130 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e  onable so I do n
10140 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74  ot doubt that it
10150 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20   might happen.  
10160 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20  If.** the close 
10170 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20  fails, we pause 
10180 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  for 100 millisec
10190 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61  onds and try aga
101a0 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20  in.  As.** many 
101b0 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  as MX_CLOSE_ATTE
101c0 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20  MPT attempts to 
101d0 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65  close the handle
101e0 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65   are made before
101f0 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e  .** giving up an
10200 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
10210 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rror..*/.#define
10220 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
10230 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77  T 3.static int w
10240 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  inClose(sqlite3_
10250 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
10260 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20   rc, cnt = 0;.  
10270 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10280 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
10290 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
102a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
102b0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73  E_OMIT_WAL.  ass
102c0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d  ert( pFile->pShm
102d0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
102e0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68  assert( pFile->h
102f0 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d  !=NULL && pFile-
10300 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  >h!=INVALID_HAND
10310 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53  LE_VALUE );.  OS
10320 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
10330 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  le=%p\n", pFile-
10340 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
10350 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10360 30 0a 20 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61  0.  rc = winUnma
10370 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20  pfile(pFile);.  
10380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10390 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  K ) return rc;.#
103a0 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20  endif..  do{.   
103b0 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
103c0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
103d0 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
103e0 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
103f0 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
10400 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
10410 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
10420 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
10430 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33  EMPT && (sqlite3
10440 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
10450 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c  ), 1) );.#if SQL
10460 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65  ITE_OS_WINCE.#de
10470 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54  fine WINCE_DELET
10480 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20  ION_ATTEMPTS 3. 
10490 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
104a0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  k(pFile);.  if( 
104b0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
104c0 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74  Close ){.    int
104d0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
104e0 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ile(.           
104f0 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46  osDeleteFileW(pF
10500 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
10510 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
10520 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  && osGetFileAttr
10530 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
10540 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
10550 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
10560 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
10570 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
10580 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
10590 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
105a0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
105b0 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
105c0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
105d0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
105e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
105f0 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
10600 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
10610 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
10620 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
10630 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
10640 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
10650 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
10660 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
10670 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
10680 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
10690 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
106a0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
106b0 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
106c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
106d0 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
106e0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
10710 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
10720 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
10730 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
10740 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
10750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
10760 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
10770 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
10780 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
10790 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
107a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
107b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
107c0 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
107d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
107e0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
107f0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
10800 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
10810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10820 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
10830 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
10840 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
10850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10860 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
10870 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
10880 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
10890 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
108a0 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
108b0 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
108c0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
108d0 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  E.  OVERLAPPED o
108e0 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
108f0 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
10900 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
10910 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
10920 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
10930 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
10940 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
10950 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10980 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
10990 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
109a0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
109d0 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
109e0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
109f0 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
10a00 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
10a10 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
10a20 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
10a30 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
10a40 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
10a50 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  AD file=%p, buff
10a60 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
10a70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
10a80 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
10a90 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
10aa0 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
10ab0 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
10ac0 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
10ad0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10ae0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
10af0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
10b00 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
10b10 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
10b20 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
10b30 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
10b40 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
10b50 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
10b60 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
10b70 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
10b80 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
10b90 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
10ba0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
10bb0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
10bc0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
10bd0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
10be0 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
10bf0 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
10c00 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
10c10 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
10c20 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
10c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10c50 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
10c60 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
10c70 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
10c80 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
10c90 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
10ca0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
10cb0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
10cc0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
10cd0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
10ce0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
10cf0 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
10d00 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
10d10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
10d20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10d30 45 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46  E.  if( seekWinF
10d40 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
10d50 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
10d60 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
10d70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
10d80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
10d90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10da0 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
10db0 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
10dc0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
10dd0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
10de0 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
10df0 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
10e00 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
10e10 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
10e20 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
10e30 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
10e40 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
10e50 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
10e60 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
10e70 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
10e80 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
10e90 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
10ea0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
10eb0 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
10ec0 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
10ed0 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
10ee0 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
10ef0 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
10f00 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
10f10 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65  rrno;.    if( re
10f20 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
10f30 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
10f40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
10f50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10f60 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10f70 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
10f80 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
10f90 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c  E_IOERR_READ\n",
10fa0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
10fb0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
10fc0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10fd0 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
10fe0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10ff0 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c        "winRead",
11000 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11010 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e    }.  logIoerr(n
11020 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52  Retry);.  if( nR
11030 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
11040 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
11050 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
11060 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
11070 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
11080 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
11090 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
110a0 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
110b0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
110c0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
110d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
110e0 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  AD\n", pFile->h)
110f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11100 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
11110 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _READ;.  }..  OS
11120 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
11130 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11140 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
11150 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11160 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11170 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
11180 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
11190 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
111a0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
111b0 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
111c0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
111d0 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
111e0 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
111f0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
11200 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
11210 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
11220 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
11230 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
11240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11250 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
11260 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
11270 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
112a0 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
112b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
112c0 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
112d0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
112e0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
112f0 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
11300 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11330 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
11340 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
11350 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
11360 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
11370 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
11380 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
11390 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
113a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
113b0 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
113c0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
113d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
113e0 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
113f0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
11400 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
11410 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
11420 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
11430 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
11440 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
11450 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75  RITE file=%p, bu
11460 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
11470 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
11480 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
11490 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
114a0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
114b0 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
114c0 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
114d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
114e0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
114f0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
11500 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
11510 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
11520 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
11530 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
11540 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
11550 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
11560 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
11570 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
11580 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
11590 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
115a0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
115b0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
115c0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
115d0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
115e0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
115f0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d  OSTRACE(("WRITE-
11600 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  MMAP file=%p, rc
11610 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
11620 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
11630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11640 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
11650 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
11660 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
11670 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
11680 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
11690 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
116a0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
116b0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
116c0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
116d0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
116e0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
116f0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
11700 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
11710 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11720 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
11730 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65  WINCE.  rc = see
11740 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
11750 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
11760 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
11770 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
11780 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11790 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
117a0 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
117b0 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
117c0 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a  r WriteFile. */.
117d0 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61  #endif.    u8 *a
117e0 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
117f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
11800 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
11810 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
11820 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
11830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11840 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
11850 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
11860 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
11870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11880 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
11890 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
118a0 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20  File() call */. 
118b0 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
118c0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20  no = NO_ERROR;  
118d0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
118e0 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
118f0 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51  or() */..#if !SQ
11900 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11910 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
11920 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
11930 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
11940 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
11950 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
11960 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
11970 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
11980 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
11990 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
119a0 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
119b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
119c0 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
119d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
119e0 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  CE.      if( !os
119f0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
11a00 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
11a10 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23  &nWrite, 0) ){.#
11a20 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21  else.      if( !
11a30 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
11a40 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
11a50 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72  , &nWrite, &over
11a60 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69  lapped) ){.#endi
11a70 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  f.        if( re
11a80 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
11a90 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
11aa0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11ab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
11ad0 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
11ae0 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20  te<=(DWORD)nRem 
11af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72  );.      if( nWr
11b00 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
11b10 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a  >(DWORD)nRem ){.
11b20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
11b30 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11b40 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
11b50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
11b60 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
11b70 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  E.      offset +
11b80 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
11b90 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
11ba0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
11bb0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
11bc0 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
11bd0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
11be0 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
11bf0 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
11c00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  ;.#endif.      a
11c10 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem += nWrite;. 
11c20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72       nRem -= nWr
11c30 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ite;.    }.    i
11c40 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  f( nRem>0 ){.   
11c50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11c60 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
11c70 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
11c80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
11c90 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20  rc ){.    if(   
11ca0 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
11cb0 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  no==ERROR_HANDLE
11cc0 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20  _DISK_FULL ).   
11cd0 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e      || ( pFile->
11ce0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
11cf0 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20  _DISK_FULL )){. 
11d00 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
11d10 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
11d20 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
11d30 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
11d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11d50 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
11d60 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
11d70 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
11d80 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c  ITE_IOERR_WRITE\
11d90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11da0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
11db0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11dc0 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65  ERR_WRITE, pFile
11dd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11de0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
11df0 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ite", pFile->zPa
11e00 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
11e10 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72    logIoerr(nRetr
11e20 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
11e30 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
11e40 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
11e50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
11e80 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
11e90 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
11ea0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
11eb0 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
11ec0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11ed0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
11ee0 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
11ef0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
11f00 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
11f10 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
11f20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11f30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11f40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f50 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
11f60 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
11f70 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
11f80 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11f90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11fa0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
11fb0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
11fc0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
11fd0 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
11fe0 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
11ff0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12000 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
12010 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
12020 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
12030 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
12040 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
12050 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
12060 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
12070 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
12080 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
12090 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
120a0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
120b0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
120c0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
120d0 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
120e0 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
120f0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
12100 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
12110 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12120 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
12130 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
12140 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
12150 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
12160 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
12170 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
12180 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
12190 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
121a0 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
121b0 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
121c0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
121d0 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  if( seekWinFile(
121e0 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
121f0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
12200 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12210 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
12220 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
12250 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
12260 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
12270 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
12280 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
12290 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
122a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
122b0 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
122c0 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
122d0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
122e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
122f0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
12300 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12310 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
12320 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
12330 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12340 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
12350 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
12360 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
12370 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12380 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
12390 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
123a0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
123b0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
123c0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
123d0 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
123e0 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
123f0 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
12400 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
12410 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
12420 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
12430 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
12440 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
12450 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
12460 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
12470 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
12480 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
12490 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
124a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
124b0 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
124c0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
124d0 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
124e0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
124f0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
12500 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
12510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
12520 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12530 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
12540 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
12550 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
12560 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
12570 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
12580 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
12590 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
125a0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
125b0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
125c0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
125d0 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
125e0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
125f0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
12600 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12610 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
12620 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
12630 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
12640 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
12650 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
12660 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12670 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
12680 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
12690 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
126a0 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
126b0 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
126c0 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
126d0 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
126e0 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
126f0 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
12700 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
12710 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
12720 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
12730 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
12740 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
12750 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
12760 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
12770 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
12780 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
12790 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
127a0 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
127b0 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
127c0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
127d0 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
127e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
127f0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
12800 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12810 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
12820 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
12830 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
12840 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
12850 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
12860 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
12870 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
12880 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
12890 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
128a0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
128b0 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
128c0 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
128d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
128e0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
128f0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
12900 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
12910 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
12920 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
12930 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
12940 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
12950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
12960 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
12970 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
12980 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
12990 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
129a0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
129b0 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
129c0 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
129d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
129e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
129f0 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
12a00 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
12a10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
12a20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12a30 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
12a40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12a50 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
12a60 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
12a70 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
12a80 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
12a90 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
12aa0 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
12ab0 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
12ac0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
12ad0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
12ae0 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
12af0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
12b00 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
12b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
12b20 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
12b30 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
12b40 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
12b50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
12b60 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
12b70 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
12b80 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
12b90 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
12ba0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12bc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
12bd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12be0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
12bf0 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
12c00 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
12c10 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12c20 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
12c30 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12c40 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
12c50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
12c60 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
12c70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
12c80 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69    "winSync", pFi
12c90 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
12ca0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12cb0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
12cc0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
12cd0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
12ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
12cf0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
12d00 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
12d10 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
12d20 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12d30 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12d40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12d50 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
12d60 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
12d70 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
12d80 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
12d90 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
12da0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
12db0 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
12dc0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
12dd0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
12de0 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
12df0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
12e00 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
12e10 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
12e20 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
12e30 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
12e40 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
12e50 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
12e60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
12e90 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
12ea0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
12eb0 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
12ec0 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
12ed0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
12ee0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12ef0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12f00 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
12f10 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12f20 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
12f30 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f50 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
12f60 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12f70 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
12f80 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
12f90 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
12fa0 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
12fb0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
12fc0 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
12fd0 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
12fe0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
12ff0 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
13000 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
13010 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
13020 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
13030 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
13040 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
13050 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
13060 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
13070 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13080 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
13090 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
130a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
130b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
130c0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
130d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
130e0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
130f0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
13100 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
13110 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
13120 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13130 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
13140 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
13150 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25  ize=%p, *pSize=%
13160 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  lld, rc=%s\n",. 
13170 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13180 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a  >h, pSize, *pSiz
13190 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
131a0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
131b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
131c0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
131d0 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
131e0 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
131f0 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
13200 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
13210 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
13220 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
13230 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
13240 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
13250 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
13260 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
13270 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
13280 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
13290 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
132a0 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
132b0 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
132c0 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
132d0 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
132e0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
132f0 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
13300 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
13310 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
13320 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
13330 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
13340 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
13350 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
13360 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
13370 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
13380 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
13390 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
133a0 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
133b0 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
133c0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
133d0 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
133e0 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
133f0 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
13400 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
13410 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
13420 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
13430 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
13440 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
13450 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
13460 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
13470 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
134a0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
134b0 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
134c0 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
134d0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
134e0 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
134f0 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
13500 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
13510 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
13520 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
13530 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
13540 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
13550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
13560 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
13570 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
13580 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
13590 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
135a0 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
135b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
135c0 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
135d0 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
135e0 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
135f0 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
13600 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13610 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
13620 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
13630 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
13640 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
13650 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
13660 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
13670 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
13680 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
13690 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
136a0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
136b0 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53   isNT() ){.#if S
136c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
136d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
136e0 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
136f0 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
13700 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
13710 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
13720 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  n32.    **      
13730 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e   API LockFileEx.
13740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  .    */.    res 
13750 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  = winceLockFile(
13760 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
13770 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
13780 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73  );.#else.    res
13790 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
137a0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
137b0 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
137c0 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
137d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
137e0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
137f0 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69  _SIZE, 0);.#endi
13800 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
13810 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
13820 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  SI.  else{.    i
13830 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
13840 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
13850 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
13860 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
13870 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
13880 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
13890 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
138a0 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
138b0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
138c0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
138d0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
138e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
138f0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
13900 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
13910 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
13920 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
13930 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
13940 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
13950 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13960 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
13970 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
13980 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
13990 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54  ock */.  }.  OST
139a0 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b  RACE(("READ-LOCK
139b0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
139c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
139d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73  lite3ErrName(res
139e0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  )));.  return re
139f0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
13a00 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
13a10 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
13a20 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
13a30 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
13a40 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
13a50 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
13a60 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
13a70 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
13a80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
13a90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
13aa0 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
13ab0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
13ac0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
13ad0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
13ae0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
13af0 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
13b00 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
13b10 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
13b20 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
13b30 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13b40 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
13b50 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
13b60 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
13b70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
13b80 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
13b90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13ba0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
13bb0 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
13bc0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
13bd0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13be0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
13bf0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
13c00 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
13c10 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13c20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
13c30 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
13c40 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f  >zPath);.  }.  O
13c50 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
13c60 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  LOCK file=%p, rc
13c70 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
13c80 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
13c90 28 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72  (res)));.  retur
13ca0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
13cb0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
13cc0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
13cd0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
13ce0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
13cf0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13d00 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13d10 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13d20 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13d30 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13d40 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13d50 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
13d60 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
13d70 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
13d80 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
13d90 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
13da0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
13db0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13dc0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13dd0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13de0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13df0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13e00 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13e10 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
13e20 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13e30 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
13e40 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
13e50 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
13e60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
13e70 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
13e80 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
13e90 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
13ea0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
13eb0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
13ec0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
13ed0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
13ee0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
13ef0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13f00 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
13f10 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
13f20 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
13f30 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13f40 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
13f50 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
13f60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
13f70 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
13f80 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
13f90 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
13fa0 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
13fb0 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
13fc0 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
13fd0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
13fe0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
13ff0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
14000 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
14010 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14020 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
14030 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
14040 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
14050 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
14060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14070 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
14080 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
14090 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
140a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
140b0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
140c0 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
140d0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
140e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
140f0 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
14100 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
14110 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
14120 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
14130 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14140 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
14150 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
14160 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
14170 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
14180 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
14190 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
141a0 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
141b0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
141c0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
141d0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
141e0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
141f0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
14200 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
14210 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
14220 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
14230 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
14240 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
14250 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
14260 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
14270 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
14280 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
14290 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
142a0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
142b0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
142c0 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
142d0 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
142e0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
142f0 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
14300 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
14310 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
14320 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
14330 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
14340 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
14350 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
14360 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
14370 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65  ("LOCK-HELD file
14380 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
14390 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
143a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
143b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
143c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
143d0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
143e0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
143f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14400 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
14410 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
14420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
14430 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
14440 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
14450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
14460 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
14470 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
14480 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14490 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
144a0 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
144b0 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
144c0 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
144d0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
144e0 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
144f0 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
14500 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14510 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
14520 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
14530 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
14540 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
14550 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
14560 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65  Locktype = pFile
14570 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
14580 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  (   (pFile->lock
14590 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20  type==NO_LOCK). 
145a0 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b      || (   (lock
145b0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
145c0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26  LOCK).         &
145d0 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  & (pFile->lockty
145e0 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
145f0 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  K)).  ){.    int
14600 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
14610 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
14620 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
14630 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
14640 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
14650 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
14680 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
14690 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
146a0 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
146b0 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
146c0 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
146d0 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
146e0 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
146f0 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
14700 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
14710 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
14720 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
14730 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
14740 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
14750 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
14760 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
14770 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
14780 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
14790 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
147a0 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
147b0 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
147c0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
147d0 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
147e0 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41    */.      OSTRA
147f0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
14800 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
14810 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
14820 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14830 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
14840 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
14850 28 72 65 73 29 29 29 3b 0a 20 20 20 20 20 20 69  (res)));.      i
14860 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33  f( cnt ) sqlite3
14870 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b  _win32_sleep(1);
14880 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
14890 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
148a0 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
148b0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
148c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
148d0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
148e0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
148f0 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
14900 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14910 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
14920 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
14930 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14940 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
14950 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
14960 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
14970 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
14980 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
14990 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
149a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
149b0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
149c0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
149d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
149e0 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
149f0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
14a00 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
14a10 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
14a20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14a30 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
14a40 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
14a50 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
14a60 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
14a70 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
14a80 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
14a90 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
14aa0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
14ab0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
14ac0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
14ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ae0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
14af0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14b00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
14b10 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
14b20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
14b30 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
14b40 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
14b50 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
14b60 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
14b70 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
14b80 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
14b90 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
14ba0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
14bb0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14bc0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
14bd0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
14be0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
14bf0 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
14c00 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
14c10 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63   = unlockReadLoc
14c20 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
14c30 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
14c40 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
14c50 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14c60 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
14c70 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
14c80 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
14c90 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
14ca0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
14cb0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
14cc0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
14cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
14ce0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14cf0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14d00 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46    getReadLock(pF
14d10 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
14d20 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
14d30 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
14d40 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
14d50 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
14d60 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
14d70 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
14d80 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
14d90 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
14da0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
14db0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
14dc0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14dd0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14de0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
14df0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
14e00 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
14e10 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
14e20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
14e30 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
14e40 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
14e50 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
14e60 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
14e70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14e80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14e90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14ea0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
14eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14ec0 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
14ed0 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
14ee0 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
14ef0 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
14f00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
14f10 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
14f20 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
14f30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14f40 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
14f50 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
14f60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
14f70 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
14f80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14f90 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
14fa0 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
14fb0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
14fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14fd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
14fe0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
14ff0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15000 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
15010 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
15020 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
15030 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15040 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15050 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
15060 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
15070 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
15080 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
15090 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
150a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
150b0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
150c0 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c  int rc;.  winFil
150d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
150e0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
150f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15100 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15110 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15120 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  CK; );.  OSTRACE
15130 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
15140 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
15150 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
15160 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
15170 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
15180 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
15190 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
151a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
151b0 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
151c0 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
151d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28  file=%p, rc=%d (
151e0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
151f0 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c  ->h, rc));.  }el
15200 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  se{.    rc = win
15210 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15220 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15230 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45  ILEEX_FLAGS,RESE
15240 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
15250 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
15260 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f  ){.      winUnlo
15270 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15280 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15290 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
152a0 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
152b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
152c0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
152d0 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65  p, rc=%d (remote
152e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
152f0 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
15300 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54  sOut = rc;.  OST
15310 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15320 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
15330 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
15340 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
15350 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
15360 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
15370 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
15380 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15390 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
153a0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
153b0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
153c0 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
153d0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
153e0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
153f0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15400 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
15410 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
15420 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
15430 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
15440 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
15450 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
15460 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
15470 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
15480 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15490 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
154a0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
154b0 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
154c0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
154d0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
154e0 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
154f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
15500 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
15510 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
15520 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
15530 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
15540 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
15550 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
15560 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
15570 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
15580 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
15590 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
155a0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
155b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
155c0 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
155d0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
155e0 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
155f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15600 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
15610 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
15620 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
15630 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15640 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
15650 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
15660 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
15670 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
15680 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
15690 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
156a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
156b0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
156c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
156d0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
156e0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
156f0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
15700 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
15710 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
15720 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
15730 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
15740 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
15750 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
15760 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
15770 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
15780 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
15790 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
157a0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
157b0 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
157c0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
157d0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63         "winUnloc
157e0 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
157f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
15800 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45  f( type>=RESERVE
15810 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
15820 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
15830 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
15840 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
15850 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
15860 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
15870 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
15880 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
15890 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
158a0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
158b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
158c0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
158d0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
158e0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
158f0 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
15900 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
15910 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
15920 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
15930 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
15940 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
15950 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
15960 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
15970 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
15980 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
15990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
159a0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
159b0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
159c0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
159d0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
159e0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
159f0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
15a00 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
15a10 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
15a20 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
15a30 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
15a40 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
15a50 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
15a60 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
15a70 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
15a80 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
15a90 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
15aa0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
15ab0 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
15ac0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
15ad0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
15ae0 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
15af0 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
15b00 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
15b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
15b20 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
15b30 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
15b40 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
15b50 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
15b60 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
15b70 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
15b80 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
15b90 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
15ba0 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 23 69 66  char *zBuf);.#if
15bb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15bc0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
15bd0 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
15be0 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  nFile*, sqlite3_
15bf0 69 6e 74 36 34 29 3b 0a 23 65 6e 64 69 66 0a 0a  int64);.#endif..
15c00 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
15c10 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
15c20 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
15c30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15c40 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
15c50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15c60 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
15c70 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
15c80 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
15c90 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
15ca0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15cb0 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
15cc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
15cd0 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
15ce0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
15cf0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
15d00 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
15d10 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
15d20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15d30 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15d40 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15d50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15d60 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15d80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
15d90 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
15da0 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
15db0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
15dc0 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  nt)pFile->lastEr
15dd0 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rno;.      OSTRA
15de0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
15df0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15e00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15e10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15e30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
15e40 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
15e50 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
15e60 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
15e70 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53  *)pArg;.      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 53 51 4c 49 54 45  le=%p, rc=SQLITE
15ea0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
15eb0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
15ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15ed0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
15ee0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
15ef0 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
15f00 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
15f10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15f20 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
15f30 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
15f40 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
15f50 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
15f60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15f80 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
15f90 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
15fa0 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
15fb0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
15fc0 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
15fd0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
15fe0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
16000 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
16010 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
16020 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16030 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16040 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53      }.        OS
16060 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
16070 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
16080 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
16090 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
160a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
160b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
160c0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
160d0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
160e0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
160f0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
16100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16110 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
16120 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
16130 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
16140 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
16150 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
16160 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
16170 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
16180 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
16190 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
161a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
161b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
161c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
161d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
161e0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
161f0 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
16200 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
16210 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
16220 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
16230 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16240 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16250 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
16260 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
16270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16280 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
16290 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
162a0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
162b0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
162c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
162d0 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20  "win32");.      
162e0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
162f0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16300 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
16310 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
16320 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16330 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
16340 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
16350 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
16360 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
16370 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
16380 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
16390 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
163a0 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  ry = a[0];.     
163b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
163c0 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72  a[0] = win32Ioer
163d0 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
163e0 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
163f0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33   ){.        win3
16400 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
16410 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   = a[1];.      }
16420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
16430 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  1] = win32IoerrR
16440 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
16450 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
16460 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
16470 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
16480 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
16490 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
164a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
164b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
164c0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
164d0 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
164e0 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d  TFile = sqlite3M
164f0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65  allocZero( pFile
16500 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
16510 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
16520 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
16530 20 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 70 46    getTempname(pF
16540 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
16550 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
16560 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
16570 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
16580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
16590 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
165a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
165b0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
165c0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
165d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
165e0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
165f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
16600 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
16610 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
16620 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
16630 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
16640 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
16650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16660 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
16670 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16680 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
16690 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
166a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
166b0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
166c0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
166d0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
166e0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
166f0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
16700 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
16710 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
16720 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
16730 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
16740 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
16750 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
16760 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16770 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
16780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76   ){.          (v
16790 6f 69 64 29 77 69 6e 55 6e 6d 61 70 66 69 6c 65  oid)winUnmapfile
167a0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
167b0 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69     rc = winMapfi
167c0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
167d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
167e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
167f0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16800 72 63 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%d\n", pFile-
16810 3e 68 2c 20 72 63 29 29 3b 0a 20 20 20 20 20 20  >h, rc));.      
16820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16830 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53  .#endif.  }.  OS
16840 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
16850 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
16860 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46  _NOTFOUND\n", pF
16870 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
16880 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
16890 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
168a0 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
168b0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
168c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
168d0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
168e0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
168f0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
16900 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
16910 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
16920 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
16930 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
16940 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
16950 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
16960 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
16970 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
16980 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
16990 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
169a0 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
169b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
169c0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
169d0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
169e0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
169f0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
16a00 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
16a10 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
16a20 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
16a30 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
16a40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16a50 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
16a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
16a70 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
16a80 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
16a90 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
16aa0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
16ab0 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
16ac0 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
16ad0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
16ae0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
16af0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
16b00 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16b20 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
16b30 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
16b40 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
16b50 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
16b60 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
16b70 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
16b80 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20  WRITE:0);.}../* 
16b90 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
16ba0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
16bb0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
16bc0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
16bd0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
16be0 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
16bf0 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
16c00 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
16c10 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
16c20 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
16c30 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
16c40 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
16c50 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
16c60 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
16c70 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
16c80 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
16c90 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
16ca0 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
16cb0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
16cc0 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
16cd0 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
16ce0 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
16cf0 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
16d00 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
16d10 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
16d20 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
16d30 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
16d40 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
16d50 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
16d60 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
16d70 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
16d80 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
16d90 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
16da0 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
16db0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
16dc0 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
16dd0 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
16de0 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
16df0 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
16e00 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
16e10 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
16e20 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
16e30 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
16e40 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
16e50 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
16e60 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
16e70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16e80 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
16e90 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16ea0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
16eb0 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
16ec0 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
16ed0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
16ee0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16ef0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
16f00 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16f10 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
16f20 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
16f30 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
16f40 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
16f50 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
16f60 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
16f70 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
16f80 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
16f90 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
16fa0 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
16fb0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
16fc0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
16fd0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
16fe0 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
16ff0 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
17000 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
17010 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
17020 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
17030 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
17040 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
17050 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
17060 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
17070 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
17080 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
17090 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
170a0 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
170b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
170c0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
170d0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
170e0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
170f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
17100 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
17110 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
17120 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
17130 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
17140 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
17150 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
17160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
17170 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
17180 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
17190 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ext .**.** The f
171a0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
171b0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
171c0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
171d0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
171e0 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
171f0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
17200 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
17210 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
17220 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
17230 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
17240 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
17250 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
17260 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
17270 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
17280 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
17290 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
172a0 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
172b0 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
172c0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
172d0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
172e0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
172f0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
17300 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
17310 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
17320 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
17330 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
17340 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
17350 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
17360 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
17370 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
17380 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
17390 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
173a0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
173b0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
173c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
173d0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
173e0 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
173f0 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
17400 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
17410 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
17420 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
17430 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
17440 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
17450 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
17460 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
17470 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
17480 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
17490 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
174a0 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
174b0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
174c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
174d0 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
174e0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
174f0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
17500 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
17510 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
17520 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
17530 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
17540 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
17550 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
17560 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
17570 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
17580 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
17590 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
175a0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
175b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
175c0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
175d0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
175e0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
175f0 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
17600 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
17610 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
17620 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
17630 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
17640 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
17650 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
17660 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
17670 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
17680 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
17690 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
176a0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
176b0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
176c0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
176d0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
176e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
176f0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
17700 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
17710 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
17720 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
17730 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
17740 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
17750 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
17760 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
17770 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
17780 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
17790 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
177a0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
177b0 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
177c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
177d0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
177e0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
177f0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
17800 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
17810 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
17820 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
17830 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
17840 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
17850 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
17860 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
17870 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
17880 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
17890 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
178a0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
178c0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
178d0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
178e0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
178f0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
17900 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
17910 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
17920 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
17930 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
17940 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
17950 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
17960 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
17970 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
17980 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
17990 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
179a0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
179b0 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
179c0 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
179d0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
179e0 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
179f0 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
17a00 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
17a10 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
17a20 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
17a30 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
17a40 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
17a50 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
17a60 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
17a70 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
17a80 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
17a90 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
17aa0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
17ab0 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
17ac0 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
17ad0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
17ae0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
17af0 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
17b00 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
17b10 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
17b20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
17b30 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
17b40 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
17b50 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
17b60 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
17b70 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
17b80 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
17b90 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
17ba0 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
17bb0 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
17bc0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17be0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
17bf0 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
17c00 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
17c10 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
17c20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17c30 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
17c40 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
17c50 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
17c60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17c70 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
17c80 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
17c90 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
17ca0 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
17cb0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
17cc0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
17cd0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
17ce0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17cf0 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
17d00 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
17d10 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  f==0 );..  OSTRA
17d20 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
17d30 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
17d40 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d  offset=%d, size=
17d50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
17d60 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
17d70 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74  , lockType, ofst
17d80 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  , nByte));..  /*
17d90 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
17da0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
17db0 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
17dc0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
17dd0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
17de0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
17df0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
17e00 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
17e10 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
17e20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
17e30 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
17e40 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
17e50 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
17e60 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17e70 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
17e80 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
17e90 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
17ea0 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
17eb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
17ec0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
17ed0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
17ee0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
17ef0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
17f00 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
17f10 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
17f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
17f30 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
17f40 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
17f50 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17f70 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
17f80 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
17f90 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20  le=%p, func=%s, 
17fa0 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73  errno=%lu, rc=%s
17fb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17fc0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
17fd0 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48  (lockType == _SH
17fe0 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55  M_UNLCK) ? "winU
17ff0 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20  nlockFile" :.   
18000 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b          "winLock
18010 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61  File", pFile->la
18020 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33  stErrno, sqlite3
18030 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a  ErrName(rc)));..
18040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18050 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
18060 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74  ences to VFS met
18070 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  hods */.static i
18080 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74  nt winOpen(sqlit
18090 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68  e3_vfs*,const ch
180a0 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  ar*,sqlite3_file
180b0 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61  *,int,int*);.sta
180c0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
180d0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
180e0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
180f0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  ;../*.** Purge t
18100 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  he winShmNodeLis
18110 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
18120 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68  tries with winSh
18130 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
18140 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
18150 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
18160 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
18170 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
18180 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
18190 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
181a0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
181b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
181c0 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33  ShmPurge(sqlite3
181d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
181e0 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77  deleteFlag){.  w
181f0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a  inShmNode **pp;.
18200 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b    winShmNode *p;
18210 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61  .  BOOL bRc;.  a
18220 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
18230 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
18240 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
18250 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
18260 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
18270 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
18280 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
18290 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
182a0 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
182b0 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
182c0 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
182d0 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
182e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
182f0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
18300 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
18310 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
18320 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tex);.      for(
18330 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
18340 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
18350 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69   bRc = osUnmapVi
18360 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
18370 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
18380 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18390 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20  SHM-PURGE-UNMAP 
183a0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
183b0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
183d0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
183e0 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
183f0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
18400 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
18410 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
18420 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
18430 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
18440 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
18450 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  -CLOSE pid=%lu, 
18460 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
18470 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18480 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
18490 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
184a0 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
184b0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
184c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
184d0 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
184e0 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
184f0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
18500 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
18510 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18520 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
18530 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
18540 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
18550 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
18560 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18570 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
18580 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
18590 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
185a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
185b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
185c0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
185d0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
185e0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
185f0 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
18600 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18610 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
18620 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
18630 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18640 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18650 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
18660 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
18670 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
18680 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
18690 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
186a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
186b0 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
186c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
186d0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
186e0 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
186f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
18700 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
18710 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
18720 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
18730 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
18740 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
18750 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
18760 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
18770 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
18780 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
18790 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
187a0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
187b0 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
187c0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
187d0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
187e0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
187f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18800 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
18810 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
18820 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
18830 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
18840 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18850 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
18860 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
18870 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
18880 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
18890 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
188a0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
188b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
188e0 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
188f0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
18900 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
18910 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
18920 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
18930 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18950 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
18960 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
18970 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
18980 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
18990 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
189a0 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
189b0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
189c0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
189d0 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
189e0 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
189f0 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
18a00 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
18a10 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
18a20 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
18a30 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
18a40 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
18a50 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
18a60 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18a70 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18a80 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
18a90 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
18aa0 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
18ab0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
18ac0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
18ad0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
18ae0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
18af0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
18b00 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18b20 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
18b30 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
18b40 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
18b50 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
18b60 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
18b70 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
18b80 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
18b90 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
18ba0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
18bb0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
18bc0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
18bd0 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20   ..  /* Look to 
18be0 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
18bf0 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
18c00 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
18c10 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
18c20 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
18c30 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
18c40 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
18c50 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
18c60 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
18c70 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
18c80 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
18c90 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
18ca0 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
18cb0 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
18cc0 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
18cd0 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
18ce0 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
18cf0 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
18d00 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
18d10 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
18d20 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
18d30 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18d40 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
18d50 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
18d60 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
18d70 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
18d80 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
18d90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
18da0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18db0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
18dc0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
18dd0 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
18de0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
18df0 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
18e00 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
18e10 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
18e20 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
18e30 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
18e40 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
18e50 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
18e60 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
18e70 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
18e80 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
18e90 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
18ea0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
18eb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18ec0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
18ed0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
18ee0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
18ef0 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70    rc = winOpen(p
18f00 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20  DbFd->pVfs,.    
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
18f20 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
18f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18f40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
18f50 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20  e (UTF-8) */.   
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
18f70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53  qlite3_file*)&pS
18f80 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20  hmNode->hFile,  
18f90 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68  /* File handle h
18fa0 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ere */.         
18fb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18fc0 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45  PEN_WAL | SQLITE
18fd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18fe0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18ff0 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  EATE,.          
19000 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
19010 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
19020 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
19030 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
19040 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
19050 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
19060 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
19070 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
19080 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
19090 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
190a0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
190b0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
190c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
190d0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
190e0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
190f0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
19100 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
19110 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
19120 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
19130 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
19140 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
19150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19170 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
19180 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
19190 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
191a0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
191b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f             "winO
191c0 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e  penShm", pDbFd->
191d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
191e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
191f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19200 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65       winShmSyste
19210 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
19220 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
19230 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
19240 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
19250 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
19260 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57  e, _SHM_RDLCK, W
19270 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
19280 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
19290 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
192a0 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _err;.  }..  /* 
192b0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
192c0 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
192d0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  of the winShmNod
192e0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
192f0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
19300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19310 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
19320 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
19330 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
19340 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
19350 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
19360 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
19370 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
19380 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
19390 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
193a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
193b0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
193c0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
193d0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74  of the winShmEnt
193e0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
193f0 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
19400 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
19410 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d  w (struct winShm
19420 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
19430 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
19440 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
19450 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
19460 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
19470 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
19480 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
19490 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
194a0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
194b0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
194c0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
194d0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
194e0 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
194f0 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
19500 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19510 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
19520 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
19530 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
19540 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
19550 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
19560 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19570 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19580 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19590 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
195a0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
195b0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
195c0 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74  rr:.  winShmSyst
195d0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
195e0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
195f0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
19600 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
19610 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20  d->pVfs, 0);    
19620 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
19630 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
19640 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
19650 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
19660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19670 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
19680 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
19690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
196a0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
196b0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
196c0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
196d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
196e0 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
196f0 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
19700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19710 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  inShmUnmap(.  sq
19720 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
19730 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19740 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
19750 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
19760 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
19770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
19780 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69  lete after closi
19790 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ng if true */.){
197a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
197b0 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  d;       /* Data
197c0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
197d0 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red-memory */.  
197e0 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
197f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
19800 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
19810 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  osed */.  winShm
19820 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
19830 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19840 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
19850 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  file */.  winShm
19860 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
19870 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19880 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
19890 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44  ections */..  pD
198a0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
198b0 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
198c0 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
198d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
198e0 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
198f0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
19900 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
19910 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
19920 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
19930 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
19940 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
19950 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
19960 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
19970 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
19980 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
19990 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
199a0 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
199b0 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
199c0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
199d0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
199e0 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
199f0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
19a00 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
19a10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19a20 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
19a30 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
19a40 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
19a50 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
19a60 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
19a70 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
19a80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
19a90 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e  le, too */.  win
19aa0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
19ab0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
19ac0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
19ad0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
19ae0 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
19af0 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
19b00 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
19b10 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74  bFd->pVfs, delet
19b20 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69  eFlag);.  }.  wi
19b30 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
19b40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
19b50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19b60 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
19b70 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
19b80 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
19b90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
19ba0 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73   winShmLock(.  s
19bb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
19bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
19bd0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
19be0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
19bf0 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
19c00 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
19c10 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
19c20 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
19c30 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
19c40 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
19c50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19c60 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
19c70 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
19c80 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
19cb0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
19cc0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
19cd0 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
19ce0 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  )fd;        /* C
19cf0 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
19d00 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
19d10 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  */.  winShm *p =
19d20 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
19d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19d40 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
19d50 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
19d60 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20    winShm *pX;   
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
19d90 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
19da0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69  siblings */.  wi
19db0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
19dc0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
19dd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19de0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
19df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19e00 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
19e10 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
19e40 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
19e50 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
19e60 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
19e70 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
19e80 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
19e90 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
19ea0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
19eb0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
19ec0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
19ed0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
19ee0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
19ef0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
19f00 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
19f10 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
19f20 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
19f30 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
19f40 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
19f50 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
19f60 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
19f70 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
19f80 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
19f90 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
19fa0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
19fb0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a  CLUSIVE)!=0 );..
19fc0 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28    mask = (u16)((
19fd0 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  1U<<(ofst+n)) - 
19fe0 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61  (1U<<ofst));.  a
19ff0 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
1a000 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
1a010 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a020 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1a030 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
1a040 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1a050 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
1a060 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
1a070 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1a080 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
1a090 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
1a0a0 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
1a0b0 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
1a0c0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
1a0d0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1a0e0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1a0f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1a100 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
1a110 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
1a120 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
1a130 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
1a140 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
1a150 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
1a160 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
1a170 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1a180 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
1a190 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1a1a0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
1a1b0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
1a1c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a1d0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1a1e0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1a1f0 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
1a200 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1a210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a220 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a230 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
1a240 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
1a250 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1a260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a270 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1a280 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1a290 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1a2a0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
1a2b0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a2c0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1a2d0 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1a2e0 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1a2f0 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1a300 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1a310 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1a320 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1a330 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1a340 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1a350 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1a360 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1a370 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1a380 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1a390 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1a3a0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1a3b0 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1a3c0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1a3d0 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1a3e0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1a3f0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1a400 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1a410 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1a420 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1a430 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1a440 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a460 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1a470 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1a480 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1a490 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1a4a0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1a4b0 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1a4c0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1a4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a4e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1a4f0 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1a500 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1a510 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1a520 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1a530 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1a540 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1a550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a560 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a570 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1a580 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1a590 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1a5a0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1a5b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a5c0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1a5d0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1a5e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a5f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1a600 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1a610 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1a620 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1a630 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1a640 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1a650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1a660 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1a670 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1a680 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1a690 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1a6a0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1a6b0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1a6c0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1a6d0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1a6e0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1a6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a700 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1a710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a720 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
1a730 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
1a740 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1a750 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
1a760 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
1a770 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
1a780 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
1a790 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
1a7a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a7b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a7c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1a7d0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1a7e0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1a7f0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1a800 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
1a810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
1a830 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
1a840 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
1a850 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
1a860 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
1a870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a880 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1a890 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1a8a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
1a8b0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70  ACE(("SHM-LOCK p
1a8c0 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73  id=%lu, id=%d, s
1a8d0 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20  haredMask=%03x, 
1a8e0 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72  exclMask=%03x, r
1a8f0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1a900 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1a910 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e  ProcessId(), p->
1a920 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  id, p->sharedMas
1a930 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
1a940 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a950 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a970 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1a980 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
1a990 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
1a9a0 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
1a9b0 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
1a9c0 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
1a9d0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
1a9e0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
1a9f0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
1aa00 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
1aa10 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
1aa20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
1aa30 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1aa40 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
1aa50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
1aa60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1aa70 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
1aa80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1aa90 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1aaa0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
1aab0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1aac0 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
1aad0 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
1aae0 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
1aaf0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1ab00 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1ab10 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
1ab20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ab30 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1ab40 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1ab50 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
1ab60 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
1ab70 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1ab80 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1ab90 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1aba0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1abb0 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
1abc0 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
1abd0 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
1abe0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1abf0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
1ac00 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1ac10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1ac20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1ac30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ac40 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1ac50 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1ac60 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1ac70 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
1ac80 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
1ac90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1aca0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
1acb0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
1acc0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
1acd0 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
1ace0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
1acf0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
1ad00 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
1ad10 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
1ad20 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
1ad30 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1ad40 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
1ad50 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1ad60 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1ad70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1ad80 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
1ad90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1ada0 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1adb0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1adc0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1add0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1ade0 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1adf0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1ae00 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1ae10 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1ae20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1ae30 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1ae40 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1ae50 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
1ae60 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
1ae70 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1ae80 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
1ae90 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
1aea0 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
1aeb0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1aec0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1aed0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
1aee0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1aef0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1af00 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1af10 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1af20 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1af30 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1af40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1af50 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1af60 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1af70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1af80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1af90 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1afa0 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1afc0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1afd0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1afe0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1aff0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1b000 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1b010 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1b020 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1b030 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1b040 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
1b050 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1b060 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1b070 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1b080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1b090 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
1b0a0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
1b0b0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
1b0c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b0d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1b0e0 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
1b0f0 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
1b100 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1b110 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
1b120 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1b130 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
1b140 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
1b150 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1b160 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
1b170 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
1b180 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1b190 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1b1a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
1b1b0 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
1b1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1b1d0 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
1b1e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1b1f0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1b200 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1b210 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1b220 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1b230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1b240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b250 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
1b260 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
1b270 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
1b280 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1b290 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1b2a0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1b2b0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
1b2c0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1b2d0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1b2e0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
1b2f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b300 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
1b310 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
1b320 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
1b330 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
1b340 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1b350 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1b360 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1b370 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
1b380 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1b390 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1b3a0 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
1b3b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b3c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b3d0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1b3e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1b3f0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1b400 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1b410 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1b420 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1b430 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1b440 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1b450 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1b460 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1b470 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1b480 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1b490 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1b4a0 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1b4b0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1b4c0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1b4d0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1b4e0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1b4f0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1b500 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1b510 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1b520 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1b530 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1b540 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1b550 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1b560 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1b570 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1b580 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1b590 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1b5a0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1b5b0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1b5c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1b5d0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b5e0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1b5f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b600 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b610 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1b620 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1b630 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1b640 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1b650 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
1b660 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1b670 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1b680 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1b690 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b6a0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1b6b0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1b6c0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1b6d0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1b6e0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1b6f0 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
1b700 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
1b710 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
1b720 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1b730 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
1b740 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
1b750 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1b760 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
1b770 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1b780 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
1b790 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1b7a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
1b7b0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
1b7c0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
1b7d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1b7e0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
1b7f0 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
1b800 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
1b810 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
1b820 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
1b830 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
1b840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b850 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
1b860 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
1b870 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b880 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
1b890 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1b8a0 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
1b8b0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
1b8c0 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1b8d0 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
1b8e0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1b8f0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1b900 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b910 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
1b920 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1b930 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
1b940 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20  de->hFile.h, .  
1b950 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1b960 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
1b970 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
1b980 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
1b990 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1b9a0 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20  _HAS_ANSI).     
1b9b0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1b9c0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
1b9d0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
1b9e0 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1b9f0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1ba00 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1ba10 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1ba20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ba30 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70  SHM-MAP-CREATE p
1ba40 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1ba50 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
1ba60 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ba70 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ba80 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1ba90 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1baa0 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1bab0 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f         hMap ? "o
1bac0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1bad0 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20  .      if( hMap 
1bae0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1baf0 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64  Offset = pShmNod
1bb00 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
1bb10 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ion;.        int
1bb20 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1bb30 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1bb40 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1bb50 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69  nGranularity;.#i
1bb60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1bb70 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  T.        pMap =
1bb80 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1bb90 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49  FromApp(hMap, FI
1bba0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1bbb0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1bbc0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65            iOffse
1bbd0 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
1bbe0 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
1bbf0 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
1bc00 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
1bc10 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1bc20 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
1bc30 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1bc40 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
1bc60 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
1bc70 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
1bc80 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
1bc90 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
1bca0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1bcb0 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70  (("SHM-MAP-MAP p
1bcc0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1bcd0 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1bce0 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ze=%d, rc=%s\n",
1bcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd00 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1bd10 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
1bd20 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
1bd30 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
1bd40 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
1bd50 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
1bd60 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1bd70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
1bd80 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
1bd90 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1bda0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1bdb0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
1bdc0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1bdd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1bde0 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
1bdf0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1be00 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1be10 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
1be20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1be30 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
1be40 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
1be50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1be60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1be70 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
1be80 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1be90 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
1bea0 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
1beb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1bec0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1bed0 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
1bee0 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1bef0 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
1bf00 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
1bf10 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
1bf20 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
1bf30 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
1bf40 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
1bf50 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1bf60 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1bf70 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1bf80 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1bf90 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1bfa0 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
1bfb0 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
1bfc0 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
1bfd0 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
1bfe0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
1bff0 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
1c000 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
1c010 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1c020 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1c030 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1c040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1c050 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
1c060 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
1c070 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
1c080 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
1c090 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
1c0a0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
1c0b0 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
1c0c0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1c0d0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
1c0e0 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74  *.** Cleans up t
1c0f0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
1c100 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
1c110 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a  d file, if any..
1c120 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1c130 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74  X_MMAP_SIZE>0.st
1c140 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
1c150 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1c160 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
1c170 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f   pFile!=0 );.  O
1c180 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c190 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c1a0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1c1b0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1c1c0 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61  .           "mma
1c1d0 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70  pSize=%lld, mmap
1c1e0 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c  SizeActual=%lld,
1c1f0 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c   mmapSizeMax=%ll
1c200 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1c210 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c220 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c230 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46   pFile->hMap, pF
1c240 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
1c250 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1c260 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69  e->mmapSize, pFi
1c270 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1c280 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  al, pFile->mmapS
1c290 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20  izeMax));.  if( 
1c2a0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c2b0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
1c2c0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1c2d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c2e0 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
1c2f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1c300 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1c310 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1c320 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c330 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
1c340 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c360 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1c370 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", 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 0a 20 20 20 20 20 20 20  , pFile,.       
1c3a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
1c3b0 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
1c3c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1c3d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c3e0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1c3f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 31 22 2c      "winUnmap1",
1c420 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1c430 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1c440 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
1c450 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
1c460 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
1c470 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1c480 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ual = 0;.  }.  i
1c490 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d  f( pFile->hMap!=
1c4a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
1c4b0 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70  !osCloseHandle(p
1c4c0 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20  File->hMap) ){. 
1c4d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1c4e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1c4f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1c500 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1c510 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1c520 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
1c530 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1c540 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
1c550 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c560 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c570 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1c580 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65  hMap));.      re
1c590 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1c5a0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1c5b0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1c5c0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c5e0 77 69 6e 55 6e 6d 61 70 32 22 2c 20 70 46 69 6c  winUnmap2", pFil
1c5f0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
1c600 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  .    pFile->hMap
1c610 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
1c620 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c630 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c640 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1c650 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1c660 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1c670 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1c680 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
1c690 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c6a0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
1c6b0 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
1c6c0 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
1c6d0 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
1c6e0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
1c6f0 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
1c700 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
1c710 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
1c720 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
1c730 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
1c740 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
1c750 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
1c760 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
1c770 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
1c780 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
1c790 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
1c7a0 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
1c7b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1c7c0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1c7d0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
1c7e0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
1c7f0 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
1c800 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
1c810 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
1c820 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
1c830 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
1c840 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
1c850 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
1c860 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
1c870 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c880 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
1c890 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
1c8a0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
1c8b0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
1c8c0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
1c8d0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
1c8e0 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
1c8f0 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
1c900 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68  MMAP_SIZE, which
1c910 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
1c920 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1c930 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c940 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
1c950 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
1c960 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
1c970 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
1c980 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
1c990 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
1c9a0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1c9b0 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
1c9c0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1c9d0 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
1c9e0 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c  inFile *pFd, sql
1c9f0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
1ca00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
1ca10 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
1ca20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ca30 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
1ca40 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
1ca50 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1ca60 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1ca70 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69  lu, pFile=%p, si
1ca80 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ze=%lld\n",.    
1ca90 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1caa0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1cab0 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  pFd, nByte));.. 
1cac0 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
1cad0 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
1cae0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1caf0 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72   nMap<0 ){.    r
1cb00 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1cb10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
1cb20 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20  Fd, &nMap);.    
1cb30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1cb40 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1cb50 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1cb60 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1cb70 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a  IOERR_FSTAT\n",.
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1cb90 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1cba0 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
1cbb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cbc0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1cbd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1cbe0 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
1cbf0 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
1cc00 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
1cc10 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70  eMax;.  }.  nMap
1cc20 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e   &= ~(sqlite3_in
1cc30 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e  t64)(winSysInfo.
1cc40 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  dwPageSize - 1);
1cc50 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30  . .  if( nMap==0
1cc60 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   && pFd->mmapSiz
1cc70 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  e>0 ){.    winUn
1cc80 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
1cc90 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  }.  if( nMap!=pF
1cca0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
1ccb0 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1ccc0 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f  0;.    DWORD pro
1ccd0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1cce0 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20  ONLY;.    DWORD 
1ccf0 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50  flags = FILE_MAP
1cd00 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55  _READ;..    winU
1cd10 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1cd20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72     if( (pFd->ctr
1cd30 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
1cd40 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  _RDONLY)==0 ){. 
1cd50 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
1cd60 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  AGE_READWRITE;. 
1cd70 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49       flags |= FI
1cd80 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20  LE_MAP_WRITE;.  
1cd90 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f    }.#if SQLITE_O
1cda0 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d  S_WINRT.    pFd-
1cdb0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1cdc0 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1cdd0 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  pp(pFd->h, NULL,
1cde0 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20   protect, nMap, 
1cdf0 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
1ce00 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1ce10 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
1ce20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1ce30 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1ce40 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
1ce50 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1ce80 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
1ce90 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1cec0 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
1ced0 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  fff), NULL);.#el
1cee0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cef0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1cf00 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1cf10 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1cf20 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
1cf30 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1cf60 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1cf70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1cfb0 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1cfc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1cfd0 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
1cfe0 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
1cff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1d000 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1d010 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1d020 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d030 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
1d040 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d060 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46 64  winMapfile", pFd
1d070 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1d080 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72  /* Log the error
1d090 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e  , but continue n
1d0a0 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20  ormal operation 
1d0b0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
1d0c0 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52  te */.      OSTR
1d0d0 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43  ACE(("MAP-FILE-C
1d0e0 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  REATE pid=%lu, p
1d0f0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1d100 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1d110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d120 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d130 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1d140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d160 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
1d170 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1d180 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
1d190 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1d1a0 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
1d1b0 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
1d1c0 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
1d1d0 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
1d1e0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1d1f0 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
1d200 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
1d210 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1d220 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1d230 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
1d240 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1d250 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
1d260 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
1d270 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
1d280 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
1d290 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
1d2a0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
1d2b0 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
1d2c0 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
1d2d0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1d2e0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1d2f0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
1d300 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1d310 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1d320 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46  "winMapfile", pF
1d350 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1d360 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1d370 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  ILE-MAP pid=%lu,
1d380 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1d390 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1d3a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d3b0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d3c0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1d3d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d3e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d3f0 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
1d400 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20  gion = pNew;.   
1d410 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
1d420 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e   nMap;.    pFd->
1d430 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
1d440 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53   nMap;.  }..  OS
1d450 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1d460 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1d470 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1d480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d490 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1d4a0 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
1d4b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4c0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1d4d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1d4e0 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
1d4f0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
1d500 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d510 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
1d520 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
1d530 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
1d540 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
1d550 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
1d560 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
1d570 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
1d580 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
1d590 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
1d5a0 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
1d5b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1d5c0 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
1d5d0 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
1d5e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1d5f0 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
1d600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d610 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
1d620 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
1d630 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
1d640 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d650 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
1d660 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
1d670 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
1d680 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
1d690 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1d6a0 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
1d6b0 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
1d6c0 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
1d6d0 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
1d6e0 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
1d6f0 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68  lling winUnfetch
1d700 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1d710 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74  t winFetch(sqlit
1d720 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
1d730 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
1d740 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
1d750 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1d760 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
1d770 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
1d780 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
1d790 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
1d7a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
1d7b0 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20  if.  *pp = 0;.. 
1d7c0 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
1d7d0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1d7e0 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %p, offset=%lld,
1d7f0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25   amount=%d, pp=%
1d800 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
1d810 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d820 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f  cessId(), fd, iO
1d830 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a  ff, nAmt, pp));.
1d840 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1d850 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1d860 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  ( pFd->mmapSizeM
1d870 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ax>0 ){.    if( 
1d880 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
1d890 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1d8a0 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1d8b0 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
1d8c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d8d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54  K ){.        OST
1d8e0 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
1d8f0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1d900 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1d910 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d920 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d930 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1d940 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1d950 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d970 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
1d980 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
1d990 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
1d9a0 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
1d9b0 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
1d9c0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
1d9d0 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
1d9e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
1d9f0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1da00 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1da10 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20   pp=%p, *pp=%p, 
1da20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1da30 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1da40 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1da50 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70  d(), fd, pp, *pp
1da60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1da70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1da80 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
1da90 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
1daa0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1dab0 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
1dac0 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
1dad0 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
1dae0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
1daf0 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
1db00 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
1db10 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1db20 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
1db30 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1db40 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1db50 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
1db60 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1db70 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
1db80 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
1db90 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
1dba0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
1dbb0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1dbc0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
1dbd0 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
1dbe0 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
1dbf0 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
1dc00 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
1dc10 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
1dc20 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
1dc30 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1dc40 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
1dc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1dc60 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  inUnfetch(sqlite
1dc70 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
1dc80 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
1dc90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1dca0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
1dcb0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
1dcc0 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
1dcd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
1dce0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1dcf0 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
1dd00 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
1dd10 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
1dd20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
1dd30 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
1dd40 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
1dd50 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
1dd60 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
1dd70 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
1dd80 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
1dd90 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
1dda0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
1ddb0 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
1ddc0 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
1ddd0 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
1dde0 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
1ddf0 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
1de00 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
1de10 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
1de20 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
1de30 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
1de40 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
1de50 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
1de60 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
1de70 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
1de80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1de90 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1dea0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
1deb0 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
1dec0 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
1ded0 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
1dee0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
1def0 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
1df00 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
1df10 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
1df20 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
1df30 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
1df40 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
1df50 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
1df60 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
1df70 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
1df80 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
1df90 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  an can be omitte
1dfa0 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
1dfb0 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
1dfc0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
1dfd0 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
1dfe0 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
1dff0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
1e000 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
1e010 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
1e020 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
1e030 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e040 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1e050 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e060 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e070 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
1e080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e090 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1e0a0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1e0b0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1e0c0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1e0d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e0e0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1e0f0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1e100 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1e110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e120 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1e170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
1e180 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
1e190 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
1e1a0 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
1e1b0 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
1e1c0 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
1e1d0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1e1e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1e1f0 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
1e200 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1e230 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1e260 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
1e290 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
1e2c0 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
1e2f0 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1e320 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
1e350 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
1e380 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
1e3b0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
1e3c0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1e3d0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1e3e0 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
1e3f0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
1e400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1e410 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
1e420 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1e450 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
1e460 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
1e470 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
1e480 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1e490 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
1e4c0 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
1e4f0 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
1e500 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1e510 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1e520 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
1e530 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
1e540 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
1e550 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
1e560 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
1e570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
1e580 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
1e590 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
1e5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
1e5b0 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
1e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e620 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1e630 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1e640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e650 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1e660 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1e670 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1e680 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1e690 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1e6a0 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1e6b0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .*/../*.** Conve
1e6c0 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
1e6d0 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
1e6e0 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
1e6f0 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
1e700 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
1e710 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
1e720 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1e730 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
1e740 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1e750 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
1e760 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1e770 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
1e780 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e790 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
1e7a0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
1e7b0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
1e7c0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
1e7d0 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
1e7e0 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
1e7f0 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
1e800 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1e810 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1e820 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e830 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1e840 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1e850 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1e860 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1e870 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1e880 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1e890 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1e8a0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1e8b0 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1e8c0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1e8d0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1e8e0 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1e8f0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1e900 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1e910 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e920 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e930 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1e940 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1e950 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1e960 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1e970 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1e980 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1e990 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1e9a0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1e9b0 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1e9c0 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1e9d0 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1e9e0 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61  nTempPath;.  cha
1e9f0 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49  r zTempPath[SQLI
1ea00 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1ea10 48 5f 42 59 54 45 53 2b 32 5d 3b 0a 0a 20 20 2f  H_BYTES+2];..  /
1ea20 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1ea30 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1ea40 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1ea50 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1ea60 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1ea70 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1ea80 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1ea90 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1eaa0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1eab0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1eac0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1ead0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1eae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
1eaf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
1eb00 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
1eb10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1eb20 72 69 6e 74 66 28 53 51 4c 49 54 45 5f 57 49 4e  rintf(SQLITE_WIN
1eb30 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
1eb40 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  S-30, zTempPath,
1eb50 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1eb70 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1eb80 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  ry);.  }.#if !SQ
1eb90 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1eba0 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
1ebb0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
1ebc0 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a  lti;.    WCHAR z
1ebd0 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f  WidePath[SQLITE_
1ebe0 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43  WIN32_MAX_PATH_C
1ebf0 48 41 52 53 5d 3b 0a 20 20 20 20 69 66 28 20 6f  HARS];.    if( o
1ec00 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 53 51  sGetTempPathW(SQ
1ec10 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
1ec20 41 54 48 5f 43 48 41 52 53 2d 33 30 2c 20 7a 57  ATH_CHARS-30, zW
1ec30 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
1ec40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1ec50 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1ec60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
1ec70 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
1ec80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec90 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
1eca0 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
1ecb0 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
1ecc0 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
1ecd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
1ece0 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
1ecf0 65 33 5f 73 6e 70 72 69 6e 74 66 28 53 51 4c 49  e3_snprintf(SQLI
1ed00 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1ed10 48 5f 42 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d  H_BYTES-30, zTem
1ed20 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75  pPath, "%s", zMu
1ed30 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
1ed40 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
1ed50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ed60 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
1ed70 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
1ed80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ed90 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
1eda0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1edb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1edc0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1edd0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1ede0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
1edf0 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
1ee00 20 7a 4d 62 63 73 50 61 74 68 5b 53 51 4c 49 54   zMbcsPath[SQLIT
1ee10 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
1ee20 5f 42 59 54 45 53 5d 3b 0a 20 20 20 20 69 66 28  _BYTES];.    if(
1ee30 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
1ee40 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1ee50 5f 50 41 54 48 5f 42 59 54 45 53 2d 33 30 2c 20  _PATH_BYTES-30, 
1ee60 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b  zMbcsPath)==0 ){
1ee70 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1ee80 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
1ee90 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
1eea0 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
1eeb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eec0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
1eed0 4d 50 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  MPPATH;.    }.  
1eee0 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
1eef0 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
1ef00 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
1ef10 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
1ef20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ef30 73 6e 70 72 69 6e 74 66 28 53 51 4c 49 54 45 5f  snprintf(SQLITE_
1ef40 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
1ef50 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61  YTES-30, zTempPa
1ef60 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  th, "%s", zUtf8)
1ef70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ef80 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
1ef90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53   }else{.      OS
1efa0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
1efb0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
1efc0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
1efd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1efe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1eff0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  M;.    }.  }.#el
1f000 73 65 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f  se.  else{.    /
1f010 2a 0a 20 20 20 20 2a 2a 20 43 6f 6d 70 69 6c 65  *.    ** Compile
1f020 64 20 77 69 74 68 6f 75 74 20 41 4e 53 49 20 73  d without ANSI s
1f030 75 70 70 6f 72 74 20 61 6e 64 20 74 68 65 20 63  upport and the c
1f040 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6e 67  urrent operating
1f050 20 73 79 73 74 65 6d 0a 20 20 20 20 2a 2a 20 69   system.    ** i
1f060 73 20 6e 6f 74 20 57 69 6e 64 6f 77 73 20 4e 54  s not Windows NT
1f070 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
1f080 74 20 7a 65 72 6f 20 74 68 65 20 74 65 6d 70 6f  t zero the tempo
1f090 72 61 72 79 20 62 75 66 66 65 72 2e 0a 20 20 20  rary buffer..   
1f0a0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   */.    memset(z
1f0b0 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 53 51 4c  TempPath, 0, SQL
1f0c0 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
1f0d0 54 48 5f 42 59 54 45 53 2b 32 29 3b 0a 20 20 7d  TH_BYTES+2);.  }
1f0e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f0f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1f100 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 65 6c 73 65   */.#else.  else
1f110 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1f120 43 6f 6d 70 69 6c 65 64 20 66 6f 72 20 57 69 6e  Compiled for Win
1f130 52 54 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  RT and the sqlit
1f140 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1f150 79 20 69 73 20 6e 6f 74 20 73 65 74 3b 0a 20 20  y is not set;.  
1f160 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 2c 20    ** therefore, 
1f170 6a 75 73 74 20 7a 65 72 6f 20 74 68 65 20 74 65  just zero the te
1f180 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 2e 0a  mporary buffer..
1f190 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
1f1a0 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20  t(zTempPath, 0, 
1f1b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
1f1c0 5f 50 41 54 48 5f 42 59 54 45 53 2b 32 29 3b 0a  _PATH_BYTES+2);.
1f1d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53    }.#endif /* !S
1f1e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
1f1f0 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
1f200 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
1f210 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
1f220 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
1f230 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
1f240 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
1f250 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
1f260 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
1f270 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71    nTempPath = sq
1f280 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
1f290 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28  empPath);..  if(
1f2a0 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71   (nTempPath + sq
1f2b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
1f2c0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1f2d0 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
1f2e0 6e 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52  nBuf ){.    OSTR
1f2f0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
1f300 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
1f310 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
1f320 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1f330 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  R;.  }..  for(i=
1f340 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26  nTempPath; i>0 &
1f350 26 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 54  & winIsDirSep(zT
1f360 65 6d 70 50 61 74 68 5b 69 2d 31 5d 29 3b 20 69  empPath[i-1]); i
1f370 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74  --){}.  zTempPat
1f380 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  h[i] = 0;..  sql
1f390 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1f3a0 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e 54  uf-18, zBuf, (nT
1f3b0 65 6d 70 50 61 74 68 20 3e 20 30 29 20 3f 0a 20  empPath > 0) ?. 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 20 20 20 20 22 25 73 25 73 22 20 53 51 4c        "%s%s" SQL
1f3e0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1f3f0 45 46 49 58 20 3a 20 53 51 4c 49 54 45 5f 54 45  EFIX : SQLITE_TE
1f400 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a  MP_FILE_PREFIX,.
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 7a 54 65 6d 70 50 61 74 68 2c 20 77 69     zTempPath, wi
1f430 6e 47 65 74 44 69 72 44 65 70 28 29 29 3b 0a 20  nGetDirDep());. 
1f440 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
1f450 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
1f460 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1f470 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
1f480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
1f490 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1f4a0 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
1f4b0 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
1f4c0 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
1f4d0 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
1f4e0 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
1f4f0 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
1f500 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53  [j+1] = 0;..  OS
1f510 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
1f520 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ENAME name=%s, r
1f530 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1f540 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
1f550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f560 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1f570 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
1f580 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64  le is really a d
1f590 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
1f5a0 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74  n false if.** it
1f5b0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   is something ot
1f5c0 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63  her than a direc
1f5d0 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72  tory, or if ther
1f5e0 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
1f5f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
1f600 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  ation failure..*
1f610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1f620 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
1f630 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20   *zConverted){. 
1f640 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
1f650 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
1f660 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
1f670 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1f680 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1f690 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
1f6a0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
1f6b0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
1f6c0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
1f6d0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
1f6e0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
1f6f0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
1f700 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
1f710 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1f720 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
1f750 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1f780 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
1f790 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1f7a0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
1f7b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1f7c0 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
1f7d0 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
1f7e0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
1f7f0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
1f800 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
1f810 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
1f820 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
1f830 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1f840 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
1f850 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
1f860 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
1f870 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
1f880 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
1f890 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
1f8a0 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
1f8b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1f8c0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
1f8d0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
1f8e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1f8f0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Vfs,        /* N
1f900 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
1f910 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1f920 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f930 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
1f940 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
1f950 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
1f960 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
1f970 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
1f980 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
1f990 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1f9a0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
1f9b0 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
1f9c0 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
1f9d0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1f9e0 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
1f9f0 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
1fa00 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1fa10 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65  no;.  DWORD dwDe
1fa20 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
1fa30 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
1fa40 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
1fa50 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
1fa60 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
1fa70 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1fa80 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
1fa90 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
1faa0 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
1fab0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
1fac0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
1fad0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1fae0 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
1faf0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
1fb00 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
1fb10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
1fb20 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
1fb30 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
1fb40 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
1fb50 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
1fb60 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
1fb70 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
1fb80 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
1fb90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
1fba0 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
1fbb0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
1fbc0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
1fbd0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
1fbe0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
1fbf0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
1fc00 6e 61 6d 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  name[SQLITE_WIN3
1fc10 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
1fc20 2b 32 5d 3b 20 2f 2a 20 42 75 66 66 65 72 20 66  +2]; /* Buffer f
1fc30 6f 72 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65  or temp filename
1fc40 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
1fc50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1fc60 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
1fc70 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
1fc80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
1fc90 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
1fca0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
1fcb0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
1fcc0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
1fcd0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
1fce0 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
1fcf0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
1fd00 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1fd10 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1fd20 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
1fd30 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1fd40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1fd50 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
1fd60 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
1fd70 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1fd80 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1fd90 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
1fda0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1fdb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1fdc0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
1fdd0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
1fde0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1fdf0 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
1fe00 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
1fe10 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
1fe20 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
1fe30 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
1fe40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1fe50 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
1fe60 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1fe70 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1fe80 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
1fe90 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
1fea0 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
1feb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
1fec0 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65  N name=%s, pFile
1fed0 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%p, flags=%x, p
1fee0 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a  OutFlags=%p\n",.
1fef0 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38             zUtf8
1ff00 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c  Name, id, flags,
1ff10 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20   pOutFlags));.. 
1ff20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
1ff30 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
1ff40 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
1ff50 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
1ff60 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
1ff70 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
1ff80 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
1ff90 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
1ffa0 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
1ffb0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
1ffc0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
1ffd0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
1ffe0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
1fff0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
20000 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
20010 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
20020 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
20030 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
20040 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
20050 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
20060 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20070 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
20080 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
20090 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
200a0 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
200b0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
200c0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
200d0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
200e0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
200f0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
20100 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
20110 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
20120 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
20130 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
20140 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
20150 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
20160 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
20170 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
20180 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
20190 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
201a0 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
201b0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
201c0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
201d0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
201e0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
201f0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
20200 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
20210 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
20220 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
20230 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
20240 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
20250 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
20260 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
20270 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
20280 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
20290 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
202a0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
202b0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
202c0 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
202d0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
202e0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
202f0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
20300 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
20310 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
20320 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
20330 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
20340 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
20350 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
20360 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
20370 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
20380 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
20390 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
203a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
203b0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
203c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
203d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
203e0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
203f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
20400 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
20410 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
20420 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
20430 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
20440 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
20450 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
20460 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46  (winFile));.  pF
20470 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  ile->h = INVALID
20480 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a  _HANDLE_VALUE;..
20490 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
204a0 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38  NRT.  if( !zUtf8
204b0 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33  Name && !sqlite3
204c0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
204d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
204e0 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
204f0 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
20500 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
20510 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
20520 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
20530 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
20540 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
20550 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
20560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20570 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
20580 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
20590 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
205a0 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se .  */.  if( !
205b0 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
205c0 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
205d0 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
205e0 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
205f0 67 65 74 54 65 6d 70 6e 61 6d 65 28 53 51 4c 49  getTempname(SQLI
20600 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
20610 48 5f 42 59 54 45 53 2b 32 2c 20 7a 54 6d 70 6e  H_BYTES+2, zTmpn
20620 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
20630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20640 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
20650 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
20660 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
20670 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
20680 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
20690 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
206a0 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
206b0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
206c0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
206d0 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
206e0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
206f0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
20700 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
20710 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
20720 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
20730 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
20740 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
20750 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
20760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
20770 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
20780 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
20790 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
207a0 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
207b0 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
207c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
207d0 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
207e0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
207f0 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
20800 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
20810 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
20820 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
20830 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
20840 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
20850 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
20860 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
20870 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
20880 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
20890 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
208a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
208b0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
208c0 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
208d0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
208e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
208f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
20900 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
20910 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
20920 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
20930 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
20940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20950 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
20960 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
20970 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
20980 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
20990 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
209a0 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
209b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
209c0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
209d0 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
209e0 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
209f0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
20a00 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
20a10 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
20a20 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61  le is .  ** crea
20a30 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
20a40 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
20a50 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
20a60 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20  e access" .  ** 
20a70 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
20a80 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
20a90 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
20aa0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
20ab0 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
20ac0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
20ad0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
20ae0 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
20af0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
20b00 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
20b10 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
20b20 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
20b30 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
20b40 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
20b50 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
20b60 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
20b70 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
20b80 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
20b90 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
20ba0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
20bb0 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
20bc0 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
20bd0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
20be0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
20bf0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
20c00 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
20c10 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
20c20 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
20c30 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
20c40 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
20c50 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
20c60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20c70 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
20c80 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
20c90 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
20ca0 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
20cb0 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
20cc0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
20cd0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
20ce0 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
20d10 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
20d20 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
20d50 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
20d60 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
20d70 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
20d80 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
20d90 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
20da0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
20db0 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
20dc0 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
20dd0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
20de0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
20df0 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
20e00 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
20e10 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
20e20 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
20e30 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
20e40 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
20e50 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
20e60 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
20e70 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
20e80 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
20e90 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
20ea0 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
20eb0 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20  NDED_PARAMETERS 
20ec0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
20ed0 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  rs;.    extended
20ee0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a  Parameters.dwSiz
20ef0 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54  e = sizeof(CREAT
20f00 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
20f10 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20  PARAMETERS);.   
20f20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
20f30 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ers.dwFileAttrib
20f40 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20  utes =.         
20f50 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
20f60 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41  ributes & FILE_A
20f70 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20  TTRIBUTE_MASK;. 
20f80 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
20f90 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67  eters.dwFileFlag
20fa0 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74  s = dwFlagsAndAt
20fb0 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
20fc0 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  FLAG_MASK;.    e
20fd0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
20fe0 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46  s.dwSecurityQosF
20ff0 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f  lags = SECURITY_
21000 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65  ANONYMOUS;.    e
21010 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
21020 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72  s.lpSecurityAttr
21030 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  ibutes = NULL;. 
21040 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
21050 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46  eters.hTemplateF
21060 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
21070 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
21080 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53  eateFile2((LPCWS
21090 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
210c0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
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 20 20 20 64 77 53 68              dwSh
210f0 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
21120 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74              &ext
21150 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29  endedParameters)
21160 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
21170 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
211a0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
211b0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
211c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
211d0 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  */.    }.#else. 
211e0 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
211f0 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50  sCreateFileW((LP
21200 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
21210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
21240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
21260 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
21270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
212a0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
212d0 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
21300 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
21310 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
21340 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
21350 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
21360 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
21370 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21380 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21390 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
213a0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
213b0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
213c0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
213d0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
21400 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
21430 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
21460 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
21490 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
214a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
214d0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
21500 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
21510 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21530 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  Noop */.    }.  
21540 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f  }.#endif.  logIo
21550 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54  err(cnt);..  OST
21560 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
21570 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
21580 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c  cess=%lx, rc=%s\
21590 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65  n", h, zUtf8Name
215a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44  ,.           dwD
215b0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68  esiredAccess, (h
215c0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
215d0 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
215e0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
215f0 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
21600 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
21610 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
21620 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
21630 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
21640 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
21650 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
21660 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  no, "winOpen", z
21670 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73  Utf8Name);.    s
21680 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21690 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28  verted);.    if(
216a0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
216b0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
216c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
216d0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
216e0 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
216f0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
21700 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a  PEN_READONLY) &.
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50       ~(SQLITE_OP
21730 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
21740 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
21750 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74  ),.         pOut
21760 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
21770 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
21780 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
21790 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
217a0 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
217b0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
217c0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
217d0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
217e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
217f0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
21800 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
21810 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
21820 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
21830 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
21840 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
21850 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
21860 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c  x, pOutFlags=%p,
21870 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20   *pOutFlags=%d, 
21880 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63  ".           "rc
21890 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
218a0 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
218b0 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73  ccess, pOutFlags
218c0 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20  , pOutFlags ?.  
218d0 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c           *pOutFl
218e0 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56  ags : 0, (h==INV
218f0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
21900 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
21910 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c  "ok"));..#if SQL
21920 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
21930 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
21940 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
21950 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
21960 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
21970 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
21980 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
21990 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
219a0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
219b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
219c0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
219d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
219e0 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d  EN-CE-LOCK name=
219f0 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e  %s, rc=%s\n", zN
21a00 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
21a10 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72  ame(rc)));.    r
21a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21a30 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
21a40 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
21a50 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
21a60 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
21a70 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
21a80 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21a90 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 70 46  rted);.  }..  pF
21aa0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
21ab0 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
21ac0 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
21ad0 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  s;.  pFile->h = 
21ae0 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  h;.  if( isReado
21af0 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  nly ){.    pFile
21b00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
21b10 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  INFILE_RDONLY;. 
21b20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
21b30 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
21b40 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
21b50 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
21b60 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
21b70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
21b80 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
21b90 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  .  }.  pFile->la
21ba0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
21bb0 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61  OR;.  pFile->zPa
21bc0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20  th = zName;.#if 
21bd0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
21be0 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e  SIZE>0.  pFile->
21bf0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70  hMap = NULL;.  p
21c00 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
21c10 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
21c20 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mapSize = 0;.  p
21c30 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
21c40 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c  tual = 0;.  pFil
21c50 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
21c60 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21c70 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
21c80 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  dif..  OpenCount
21c90 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
21ca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
21cb0 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
21cc0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
21cd0 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
21ce0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
21cf0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
21d00 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
21d10 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
21d20 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
21d30 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
21d40 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
21d50 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
21d60 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
21d70 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
21d80 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
21d90 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
21da0 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
21db0 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
21dc0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
21dd0 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
21de0 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
21df0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
21e00 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
21e10 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
21e20 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
21e30 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
21e40 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
21e50 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
21e60 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
21e70 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
21e80 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
21e90 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
21ea0 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
21eb0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
21ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21ed0 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
21ee0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
21ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
21f00 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
21f10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21f20 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
21f30 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
21f40 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
21f50 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
21f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
21f70 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
21f80 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
21f90 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21fa0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57  DWORD attr;.  DW
21fb0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
21fc0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21fd0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
21fe0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
21ff0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22000 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
22010 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
22020 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22030 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
22040 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
22050 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
22060 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
22070 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
22080 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
22090 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
220a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
220b0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
220c0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
220d0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
220e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
220f0 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e  NOMEM\n", zFilen
22100 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
22110 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
22120 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
22130 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  isNT() ){.    do
22140 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
22150 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
22160 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
22170 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
22180 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
22190 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
221a0 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
221b0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
221c0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
221d0 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
221e0 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
221f0 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
22220 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
22230 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
22240 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
22250 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
22260 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
22270 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
22280 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
22290 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
222a0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
222b0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
222c0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
222d0 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
222e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
222f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
22300 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
22310 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
22320 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22330 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22340 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
22350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
22360 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
22370 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
22380 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
22390 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
223a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
223b0 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
223c0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
223d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
223e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
223f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
22400 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
22410 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
22420 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
22430 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
22440 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
22450 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
22460 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22470 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
22480 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
22490 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
224a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
224b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
224c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
224d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
224e0 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
224f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
22500 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
22510 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22520 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
22530 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
22540 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22550 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
22560 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
22570 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
22580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
22590 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
225a0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
225b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
225c0 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72 28  f ( !retryIoerr(
225d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
225e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
225f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
22600 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
22610 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
22620 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22630 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
22640 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22650 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
22660 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
22670 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
22680 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
22690 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
226a0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
226b0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
226c0 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
226d0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
226e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
226f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
22700 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
22710 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
22720 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
22730 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
22740 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
22750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22760 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
22770 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
22780 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
22790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
227a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
227b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
227c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
227d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
227e0 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
227f0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
22800 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22810 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
22820 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
22830 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
22850 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
22860 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
22870 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22880 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
22890 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
228a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
228b0 20 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72        if ( !retr
228c0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
228d0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
228e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
228f0 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
22900 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
22910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22920 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
22930 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
22940 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
22950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
22960 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
22970 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
22980 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
22990 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
229a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
229b0 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
229c0 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
229d0 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  .    logIoerr(cn
229e0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
229f0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22a00 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
22a10 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
22a20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
22a30 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
22a40 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
22a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22a60 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
22a70 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
22a80 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
22a90 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
22aa0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
22ab0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
22ac0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
22ad0 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
22ae0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22af0 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
22b00 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
22b10 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b30 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
22b40 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
22b50 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
22b60 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
22b70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
22b80 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
22b90 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
22ba0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
22bb0 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
22bc0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
22bd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
22be0 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
22bf0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
22c00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
22c10 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
22c20 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
22c30 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
22c40 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
22c50 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
22c60 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
22c70 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
22c80 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
22c90 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
22ca0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
22cb0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
22cc0 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
22cd0 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  S name=%s, rc=SQ
22ce0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22cf0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
22d00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22d10 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22d20 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
22d30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
22d40 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
22d50 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
22d60 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
22d70 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
22d80 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
22d90 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
22da0 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
22db0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
22dc0 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
22dd0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
22e00 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
22e30 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
22e40 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
22e50 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
22e60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22e70 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
22e80 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
22e90 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
22ea0 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
22eb0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
22ec0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
22ed0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
22ee0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
22ef0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
22f00 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
22f10 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
22f20 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
22f30 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
22f40 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
22f50 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
22f60 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
22f70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
22f80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22f90 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
22fa0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
22fb0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
22fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22fd0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
22fe0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
22ff0 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
23000 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
23010 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
23020 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
23030 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72          winLogEr
23040 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
23050 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
23060 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
23070 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
23080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23090 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
230a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
230b0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
230c0 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
230d0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
230e0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
230f0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
23100 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
23110 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
23120 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
23130 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
23140 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
23150 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
23160 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
23170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
23180 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
23190 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
231a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
231b0 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
231c0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
231d0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
231e0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
231f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
23200 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
23210 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23220 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
23230 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
23240 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
23250 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
23260 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
23270 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
23280 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
23290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
232a0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
232b0 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
232c0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
232d0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
232e0 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
232f0 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
23300 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
23310 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
23320 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
23330 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
23340 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
23350 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
23360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23370 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
23380 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
23390 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
233a0 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  me should be use
233b0 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a  d verbatim.  If.
233c0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  ** non-zero is r
233d0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69  eturned from thi
233e0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20  s function, the 
233f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
23400 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20   must simply.** 
23410 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64  use the provided
23420 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61   path name verba
23430 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65  tim -OR- resolve
23440 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20   it into a full 
23450 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69  path name.** usi
23460 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61  ng the GetFullPa
23470 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49  thName Win32 API
23480 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76   function (if av
23490 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ailable)..*/.sta
234a0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65  tic BOOL winIsVe
234b0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a  rbatimPathname(.
234c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
234d0 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a  athname.){.  /*.
234e0 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
234f0 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
23500 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73  h a forward slas
23510 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68  h or a backslash
23520 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20  , it is either. 
23530 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20   ** a legal UNC 
23540 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72  name, a volume r
23550 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72  elative path, or
23560 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
23570 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20  h name in the.  
23580 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74  ** "Unix" format
23590 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
235a0 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77  ere is no easy w
235b0 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ay to differenti
235c0 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a  ate between.  **
235d0 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63   the final two c
235e0 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ases; therefore,
235f0 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73   we return the s
23600 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  afer return valu
23610 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73  e of TRUE.  ** s
23620 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f  o that callers o
23630 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
23640 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20  will simply use 
23650 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a  it verbatim..  *
23660 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69  /.  if ( winIsDi
23670 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30  rSep(zPathname[0
23680 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
23690 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
236a0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
236b0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
236c0 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20  th a letter and 
236d0 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69  a colon it is ei
236e0 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20  ther a volume.  
236f0 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  ** relative path
23700 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
23710 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f  path.  Callers o
23720 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
23730 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74  must not.  ** at
23740 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69  tempt to treat i
23750 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20  t as a relative 
23760 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20  path name (i.e. 
23770 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70  they should simp
23780 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76  ly use.  ** it v
23790 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20  erbatim)..  */. 
237a0 20 69 66 20 28 20 73 71 6c 69 74 65 33 49 73 61   if ( sqlite3Isa
237b0 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30  lpha(zPathname[0
237c0 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b  ]) && zPathname[
237d0 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72  1]==':' ){.    r
237e0 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
237f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
23800 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
23810 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
23820 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
23830 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
23840 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
23850 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
23860 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
23870 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
23880 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
23890 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
238a0 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
238b0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
238c0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
238d0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
238e0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
238f0 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
23900 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
23910 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
23920 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
23930 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
23940 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
23950 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
23960 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
23970 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
23980 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
23990 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
239a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
239b0 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
239c0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
239d0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
239e0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
239f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
23a00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
23a10 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
23a20 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
23a30 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
23a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
23a50 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
23a60 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
23a70 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
23a80 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
23a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23aa0 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
23ab0 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
23ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
23ad0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 53 51  ->mxPathname>=SQ
23ae0 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
23af0 41 54 48 5f 42 59 54 45 53 20 29 3b 0a 20 20 61  ATH_BYTES );.  a
23b00 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
23b10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
23b20 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
23b30 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
23b40 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
23b50 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
23b60 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
23b70 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
23b80 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
23b90 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
23ba0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
23bb0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
23bc0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
23bd0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
23be0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
23bf0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
23c00 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
23c10 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
23c20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
23c30 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
23c40 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
23c50 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
23c60 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
23c70 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
23c80 20 20 20 63 68 61 72 20 7a 4f 75 74 5b 53 51 4c     char zOut[SQL
23c90 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
23ca0 54 48 5f 42 59 54 45 53 2b 31 5d 3b 0a 20 20 20  TH_BYTES+1];.   
23cb0 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
23cc0 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f  _path(CCP_POSIX_
23cd0 54 4f 5f 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c  TO_WIN_A|CCP_REL
23ce0 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
23cf0 2c 20 7a 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , zOut,.        
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
23d20 58 5f 50 41 54 48 5f 42 59 54 45 53 2b 31 29 3c  X_PATH_BYTES+1)<
23d30 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
23d40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
23d50 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
23d60 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 20 22   (DWORD)errno, "
23d70 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
23d80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23d90 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 29 3b       zRelative);
23da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23db0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
23dc0 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
23dd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23de0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
23df0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
23e00 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25 73 22   zFull, "%s%s%s"
23e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
23e30 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
23e40 69 6e 47 65 74 44 69 72 44 65 70 28 29 2c 20 7a  inGetDirDep(), z
23e50 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
23e60 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
23e70 6e 76 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49  nv_path(CCP_POSI
23e80 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c  X_TO_WIN_A, zRel
23e90 61 74 69 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46  ative, zFull, nF
23ea0 75 6c 6c 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ull)<0 ){.      
23eb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23ec0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
23ed0 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
23ee0 6e 6f 2c 20 22 63 79 67 77 69 6e 5f 63 6f 6e 76  no, "cygwin_conv
23ef0 5f 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20  _path",.        
23f00 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
23f10 69 76 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ive);.      retu
23f20 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23f30 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
23f40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
23f60 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
23f70 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
23f80 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
23f90 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
23fa0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
23fb0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
23fc0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
23fd0 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
23fe0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
23ff0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
24000 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
24010 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
24020 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
24030 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
24040 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
24050 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
24060 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
24070 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
24080 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
24090 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
240a0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
240b0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
240c0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
240d0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
240e0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
240f0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
24100 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
24110 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
24120 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
24130 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
24140 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
24150 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
24160 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
24170 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
24180 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
24190 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
241a0 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
241b0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
241c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
241d0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
241e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
241f0 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25 73 22 2c  zFull, "%s%s%s",
24200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24210 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
24220 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
24230 6e 47 65 74 44 69 72 44 65 70 28 29 2c 20 7a 52  nGetDirDep(), zR
24240 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
24250 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
24260 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
24270 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
24280 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
24290 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
242a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
242b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
242c0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
242d0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
242e0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
242f0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
24300 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
24310 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24320 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
24330 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
24340 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
24350 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
24360 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
24370 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
24380 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
24390 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
243a0 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
243b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
243c0 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
243d0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68  && sqlite3Isalph
243e0 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20  a(zRelative[1]) 
243f0 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d  && zRelative[2]=
24400 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c  =':' ){.    zRel
24410 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
24420 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
24430 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
24440 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
24450 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
24460 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
24470 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
24480 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
24490 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
244a0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
244b0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
244c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
244d0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
244e0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
244f0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
24500 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
24510 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
24520 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
24530 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
24540 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
24550 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
24560 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
24570 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
24580 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
24590 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
245a0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
245b0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
245c0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
245d0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
245e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
245f0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
24600 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
24610 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
24620 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
24630 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
24640 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
24650 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
24660 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
24670 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
24680 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
24690 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
246a0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
246b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
246c0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
246d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
246e0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73  e), zFull, "%s%s
246f0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
24700 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24710 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
24720 2c 20 77 69 6e 47 65 74 44 69 72 44 65 70 28 29  , winGetDirDep()
24730 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
24740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24750 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
24760 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
24770 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
24780 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
24790 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
247a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
247b0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
247c0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
247d0 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
247e0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
247f0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
24800 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
24810 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
24820 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
24830 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
24840 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
24850 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
24860 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
24870 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
24880 6c 50 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43  lPathNameW1", zC
24890 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
248a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
248b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
248c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
248d0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
248e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
248f0 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
24900 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
24910 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
24920 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
24930 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
24940 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
24950 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
24960 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
24970 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
24980 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
24990 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
249a0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
249b0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
249c0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
249d0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
249e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
249f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
24a00 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
24a10 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
24a20 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
24a30 6c 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a  llPathNameW2", z
24a40 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24a60 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24a70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24a80 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
24a90 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
24aa0 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20  PEN_FULLPATH;.  
24ab0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
24ac0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
24ad0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69  ;.    zOut = uni
24ae0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
24af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24b00 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
24b10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24b20 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
24b30 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
24b40 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
24b50 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
24b60 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
24b70 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
24b80 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
24b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
24ba0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
24bb0 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
24bc0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
24bd0 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
24be0 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c 20 7a  llPathNameA1", z
24bf0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24c10 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24c20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24c30 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
24c40 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  H;.    }.    nBy
24c50 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
24c60 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
24c70 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
24c80 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
24c90 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
24ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24cb0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24cc0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
24cd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24ce0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
24cf0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
24d00 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
24d10 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
24d20 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
24d30 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
24d40 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
24d50 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
24d60 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
24d70 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
24d80 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
24d90 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c 20 7a 43  lPathNameA2", zC
24da0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24dc0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24dd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
24de0 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
24df0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24e00 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
24e10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
24e20 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24e30 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
24e40 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
24e50 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
24e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24e70 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
24e80 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
24e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24ea0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
24eb0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
24ec0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
24ed0 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
24ee0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
24ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24f00 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
24f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24f20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
24f30 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
24f40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24f50 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
24f60 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
24f70 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
24f80 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
24f90 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
24fa0 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
24fb0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
24fc0 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
24fd0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
24fe0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
24ff0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
25000 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
25010 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
25020 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
25030 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
25040 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
25050 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
25060 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
25070 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
25080 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25090 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
250a0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
250b0 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
250c0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
250d0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
250e0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
250f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
25100 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Vfs);.  if( zCon
25110 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
25120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
25130 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
25140 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25150 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  RT.    h = osLoa
25160 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
25170 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
25180 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  rted, 0);.#else.
25190 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
251a0 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29  braryW((LPCWSTR)
251b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
251c0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
251d0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
251e0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
251f0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
25200 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ryA((char*)zConv
25210 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
25220 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
25230 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25240 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
25250 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
25260 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
25270 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
25280 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
25290 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
252a0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
252b0 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
252c0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
252d0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
252e0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
252f0 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
25300 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25310 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
25320 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
25330 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
25340 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
25350 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
25360 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41  void))osGetProcA
25370 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
25380 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  pH, zSym);.}.sta
25390 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
253a0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
253b0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
253c0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
253d0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
253e0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
253f0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
25400 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
25410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
25420 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
25430 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
25440 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
25450 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
25460 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
25470 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
25480 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
25490 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
254a0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
254b0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
254c0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
254d0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
254e0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
254f0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
25500 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
25510 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
25520 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
25530 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
25540 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
25550 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
25560 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
25570 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
25580 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
25590 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
255a0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
255b0 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
255c0 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
255d0 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
255e0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
255f0 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
25600 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
25610 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
25620 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
25630 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
25640 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  = osGetCurrentPr
25650 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
25660 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
25670 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
25680 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
25690 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69  eof(pid);.  }.#i
256a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
256b0 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  T.  if( sizeof(U
256c0 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d  LONGLONG)<=nBuf-
256d0 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f  n ){.    ULONGLO
256e0 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  NG cnt = osGetTi
256f0 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20  ckCount64();.   
25700 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
25710 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
25720 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
25730 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
25740 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
25750 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
25760 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
25770 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
25780 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
25790 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
257a0 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
257b0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
257c0 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  cnt);.  }.#endif
257d0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
257e0 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
257f0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
25800 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
25810 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
25820 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
25830 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
25840 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
25850 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
25860 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
25870 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
25880 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
25890 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
258a0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
258b0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
258c0 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
258d0 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
258e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
258f0 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
25900 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
25910 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
25920 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
25930 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25940 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
25950 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
25960 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
25970 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
25980 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
25990 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
259a0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
259b0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
259c0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
259d0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
259e0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
259f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
25a00 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
25a10 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
25a20 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
25a30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
25a40 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
25a50 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
25a60 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
25a70 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
25a80 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
25a90 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
25aa0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
25ab0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
25ac0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
25ad0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
25ae0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
25af0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
25b00 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
25b10 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
25b20 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
25b30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
25b40 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
25b50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
25b60 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
25b70 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
25b80 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
25b90 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
25ba0 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
25bb0 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
25bc0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
25bd0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
25be0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
25bf0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
25c00 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
25c10 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
25c20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
25c30 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
25c40 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
25c50 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
25c60 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
25c70 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
25c80 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
25c90 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
25ca0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
25cb0 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
25cc0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
25cd0 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
25ce0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
25cf0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
25d00 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
25d10 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
25d20 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
25d30 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
25d40 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
25d50 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
25d60 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
25d70 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
25d80 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
25d90 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
25da0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25db0 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
25dc0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
25dd0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
25de0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
25df0 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
25e00 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
25e10 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
25e20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
25e30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
25e40 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20  2BitValue = .   
25e50 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
25e60 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
25e70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
25e80 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
25e90 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
25ea0 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
25eb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
25ec0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
25ed0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
25ee0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
25ef0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
25f00 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
25f10 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
25f20 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
25f30 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
25f40 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
25f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
25f60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
25f70 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
25f80 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
25f90 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
25fa0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
25fb0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
25fc0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
25fd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
25fe0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
25ff0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
26000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26010 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
26020 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
26030 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
26040 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
26050 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
26060 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
26070 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
26080 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
26090 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
260a0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
260b0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
260c0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
260d0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
260e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
260f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
26100 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
26110 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
26120 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
26130 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
26140 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
26150 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
26160 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
26170 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
26180 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
26190 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
261a0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
261b0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
261c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
261d0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
261e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
261f0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
26200 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
26210 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
26220 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
26230 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
26240 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
26250 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
26260 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
26270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26280 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
26290 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
262a0 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
262b0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
262c0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
262d0 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
262e0 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
262f0 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
26300 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
26310 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
26320 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26330 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
26340 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
26350 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
26360 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
26370 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
26380 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
26390 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
263a0 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
263b0 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
263c0 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
263d0 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
263e0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
263f0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
26400 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
26410 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
26420 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
26430 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
26440 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
26450 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
26460 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
26470 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
26480 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
26490 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
264a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
264b0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
264c0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
264d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
264e0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
264f0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
26500 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
26510 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
26520 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
26530 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
26540 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
26550 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
26560 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
26570 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
26580 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
26590 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
265a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
265b0 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
265c0 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
265d0 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
265e0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
265f0 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
26600 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
26610 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
26620 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
26630 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
26640 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
26650 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
26660 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
26670 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
26680 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
26690 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
266a0 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
266b0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
266c0 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
266d0 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
266e0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
266f0 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
26700 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
26710 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
26720 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
26730 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
26740 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26750 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
26760 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
26770 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
26780 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
26790 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
267a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
267b0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
267c0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
267d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
267e0 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
267f0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
26800 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
26810 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
26820 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
26830 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
26840 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
26850 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
26860 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
26870 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
26880 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
26890 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
268a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
268b0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
268c0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
268d0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
268e0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
268f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
26900 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
26910 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
26920 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
26930 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
26940 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
26950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
26960 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
26990 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
269a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
269b0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
269c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
269d0 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
269e0 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
269f0 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
26a00 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
26a10 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
26a20 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
26a30 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
26a40 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
26a50 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
26a60 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
26a70 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
26a80 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
26a90 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
26aa0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
26ab0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
26ac0 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
26ad0 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
26ae0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
26af0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
26b00 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
26b10 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
26b20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
26b30 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
26b40 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
26b50 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
26b60 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
26b70 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
26b80 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
26b90 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
26ba0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
26bb0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
26bc0 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
26bd0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
26be0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
26bf0 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
26c00 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
26c10 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
26c20 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
26c30 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75  /.  };..  /* Dou
26c40 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
26c50 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
26c60 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
26c70 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
26c80 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
26c90 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
26ca0 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
26cb0 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
26cc0 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b  aSyscall)==74 );
26cd0 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  ..  /* get memor
26ce0 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
26cf0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
26d00 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
26d10 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
26d20 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23  SYSTEM_INFO));.#
26d30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
26d40 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65  RT.  osGetNative
26d50 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
26d60 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  ysInfo);.#else. 
26d70 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
26d80 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
26d90 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
26da0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
26db0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
26dc0 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ty>0 );.  assert
26dd0 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  ( winSysInfo.dwP
26de0 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20  ageSize>0 );..  
26df0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
26e00 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
26e10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26e20 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71  E_OK; .}..int sq
26e30 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
26e40 64 29 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  d){ .#if SQLITE_
26e50 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
26e60 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b  leepObj!=NULL ){
26e70 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
26e80 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20  le(sleepObj);.  
26e90 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c    sleepObj = NUL
26ea0 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  L;.  }.#endif.  
26eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ec0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
26ed0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.