/ Hex Artifact Content
Login

Artifact 0b9ab09dd3ccf8933f888c542a9b11b0bfa62659:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
0260: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0270: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0280: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0290: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
02a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
02b0: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64  ** Compiling and
02c0: 20 75 73 69 6e 67 20 57 41 4c 20 6d 6f 64 65 20   using WAL mode 
02d0: 72 65 71 75 69 72 65 73 20 73 65 76 65 72 61 6c  requires several
02e0: 20 41 50 49 73 20 74 68 61 74 20 61 72 65 20 6f   APIs that are o
02f0: 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  nly.** available
0300: 20 69 6e 20 57 69 6e 64 6f 77 73 20 70 6c 61 74   in Windows plat
0310: 66 6f 72 6d 73 20 62 61 73 65 64 20 6f 6e 20 74  forms based on t
0320: 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f  he NT kernel..*/
0330: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
0340: 57 49 4e 4e 54 20 26 26 20 21 64 65 66 69 6e 65  WINNT && !define
0350: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0360: 4c 29 0a 23 20 20 65 72 72 6f 72 20 22 57 41 4c  L).#  error "WAL
0370: 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73 20 73   mode requires s
0380: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
0390: 57 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e 65  Windows NT kerne
03a0: 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a 20 77 69 74  l, compile\. wit
03b0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  h SQLITE_OMIT_WA
03c0: 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  L.".#endif../*.*
03d0: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
03e0: 65 20 57 69 6e 33 32 20 41 4e 53 49 20 41 50 49  e Win32 ANSI API
03f0: 73 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  s available (i.e
0400: 2e 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65  . with certain e
0410: 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73  xceptions.** bas
0420: 65 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c  ed on the sub-pl
0430: 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20  atform)?.*/.#if 
0440: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
0450: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
0460: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0480: 41 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ANSI.#endif../*.
0490: 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74  ** Are most of t
04a0: 68 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65  he Win32 Unicode
04b0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
04c0: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
04d0: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
04e0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
04f0: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0500: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0510: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
0520: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0530: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
0540: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0550: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
0560: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0570: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0580: 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57  (in chars) for W
0590: 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75  in32.  This shou
05a0: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
05b0: 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23  * MAX_PATH..*/.#
05c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
05d0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
05e0: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
05f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
0600: 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f  TH_CHARS   (MAX_
0610: 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  PATH).#endif../*
0620: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0630: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0640: 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54  chars) for WinNT
0650: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0660: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33 32  ormally be.** 32
0670: 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  767..*/.#ifndef 
0680: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0690: 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64  _PATH_CHARS.#  d
06a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
06b0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
06c0: 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64  S   (32767).#end
06d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
06e0: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
06f0: 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72  h (in bytes) for
0700: 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58   Win32.  The MAX
0710: 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69  _PATH macro is i
0720: 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  n.** characters,
0730: 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20   so we allocate 
0740: 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61 72  3 bytes per char
0750: 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77  acter assuming w
0760: 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20  orst-case of.** 
0770: 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72  4-bytes-per-char
0780: 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a  acter for UTF8..
0790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
07a0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
07b0: 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65  _BYTES.#  define
07c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
07d0: 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 28  X_PATH_BYTES   (
07e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
07f0: 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23  _PATH_CHARS*4).#
0800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0810: 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65  imum pathname le
0820: 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20  ngth (in bytes) 
0830: 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73  for WinNT.  This
0840: 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
0850: 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20 73   be.** 32767 * s
0860: 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f  izeof(WCHAR)..*/
0870: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0880: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0890: 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53  YTES.#  define S
08a0: 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
08b0: 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20  PATH_BYTES   \. 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
08e0: 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49  of(WCHAR) * SQLI
08f0: 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
0900: 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a  H_CHARS).#endif.
0910: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65  ./*.** Maximum e
0920: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e  rror message len
0930: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0940: 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66  or WinRT..*/.#if
0950: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0960: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
0970: 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RS.#  define SQL
0980: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
0990: 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 34  RMSG_CHARS (1024
09a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
09b0: 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
09c0: 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74 65   if the characte
09d0: 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61  r should be trea
09e0: 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74 6f  ted as a directo
09f0: 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  ry.** separator.
0a00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49  .*/.#ifndef winI
0a10: 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e  sDirSep.#  defin
0a20: 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61 29  e winIsDirSep(a)
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c  (((a) == '/') ||
0a50: 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a   ((a) == '\\')).
0a60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0a70: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
0a80: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0a90: 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72 65  used as the dire
0aa0: 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 2e  ctory separator.
0ab0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 47  .*/.#ifndef winG
0ac0: 65 74 44 69 72 44 65 70 0a 23 20 20 69 66 64 65  etDirDep.#  ifde
0ad0: 66 20 5f 5f 43 59 47 57 49 4e 5f 5f 0a 23 20 20  f __CYGWIN__.#  
0ae0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
0af0: 69 72 44 65 70 28 29 20 20 20 20 20 20 20 20 20  irDep()         
0b00: 20 20 20 20 20 22 2f 22 0a 23 20 20 65 6c 73 65       "/".#  else
0b10: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 77 69 6e  .#    define win
0b20: 47 65 74 44 69 72 44 65 70 28 29 20 20 20 20 20  GetDirDep()     
0b30: 20 20 20 20 20 20 20 20 20 22 5c 5c 22 0a 23 20           "\\".# 
0b40: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0b50: 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20  *.** Do we need 
0b60: 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69  to manually defi
0b70: 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c  ne the Win32 fil
0b80: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66  e mapping APIs f
0b90: 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a  or use with WAL.
0ba0: 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68  ** mode (e.g. th
0bb0: 65 73 65 20 41 50 49 73 20 61 72 65 20 61 76 61  ese APIs are ava
0bc0: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69  ilable in the Wi
0bd0: 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f  ndows CE SDK; ho
0be0: 77 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61  wever, they.** a
0bf0: 72 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  re not present i
0c00: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c  n the header fil
0c10: 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  e)?.*/.#if SQLIT
0c20: 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50  E_WIN32_FILEMAPP
0c30: 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66 69  ING_API && !defi
0c40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0c50: 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f  WAL)./*.** Two o
0c60: 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69  f the file mappi
0c70: 6e 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66  ng APIs are diff
0c80: 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52  erent under WinR
0c90: 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  T.  Figure out w
0ca0: 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e  hich.** set we n
0cb0: 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  eed..*/.#if SQLI
0cc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42  TE_OS_WINRT.WINB
0cd0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
0ce0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
0cf0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41  appingFromApp(HA
0d00: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
0d10: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
0d20: 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c  BUTES, ULONG, UL
0d30: 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b  ONG64, LPCWSTR);
0d40: 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56  ..WINBASEAPI LPV
0d50: 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69  OID WINAPI MapVi
0d60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
0d70: 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55  HANDLE, ULONG, U
0d80: 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b  LONG64, SIZE_T);
0d90: 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e  .#else.#if defin
0da0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0db0: 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53  HAS_ANSI).WINBAS
0dc0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
0dd0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
0de0: 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50  pingA(HANDLE, LP
0df0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0e00: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
0e10: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
0e20: 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e  RD, LPCSTR);.#en
0e30: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
0e40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0e50: 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65  ANSI) */..#if de
0e60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0e70: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e  32_HAS_WIDE).WIN
0e80: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
0e90: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
0ea0: 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c  MappingW(HANDLE,
0eb0: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
0ec0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
0ed0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
0ee0: 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b  DWORD, LPCWSTR);
0ef0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
0f00: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0f10: 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49  HAS_WIDE) */..WI
0f20: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
0f30: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
0f40: 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f  File(HANDLE, DWO
0f50: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0f60: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69  , SIZE_T);.#endi
0f70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
0f80: 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  INRT */../*.** T
0f90: 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  his file mapping
0fa0: 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74   API is common t
0fb0: 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64  o both Win32 and
0fc0: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41   WinRT..*/.WINBA
0fd0: 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50  SEAPI BOOL WINAP
0fe0: 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  I UnmapViewOfFil
0ff0: 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64  e(LPCVOID);.#end
1000: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
1010: 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41  32_FILEMAPPING_A
1020: 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  PI && !defined(S
1030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
1040: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
1050: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
1060: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
1070: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
1080: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
1090: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
10a0: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
10b0: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
10c0: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
10d0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
10e0: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
10f0: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
1100: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
1110: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
1120: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
1130: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
1140: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
1150: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
1160: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
1190: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
11a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
11b0: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11d0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
11e0: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
11f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1200: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
1210: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
1220: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
1230: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
1240: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
1250: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
1260: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
1270: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
1280: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
1290: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
12a0: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
12b0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
12c0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
12d0: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
12e0: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
12f0: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
1300: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
1310: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
1320: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
1330: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
1340: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1350: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
1360: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
1370: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
1380: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
1390: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
13a0: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
13b0: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
13c0: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
13d0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
13e0: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
13f0: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
1400: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
1410: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
1420: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1430: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
1440: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
1450: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
1460: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
1470: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
1480: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
1490: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
14a0: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
14b0: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
14c0: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
14d0: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
14e0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
14f0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
1500: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
1510: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
1520: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1530: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
1540: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
1550: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
1560: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
1570: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
1580: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1590: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
15a0: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
15b0: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
15c0: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
15d0: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
15e0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
15f0: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1600: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1610: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1620: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
1630: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
1640: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1650: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1660: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1690: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
16a0: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
16b0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
16c0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
16d0: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
16e0: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
16f0: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1700: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1710: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
1730: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
1740: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1750: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1760: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1770: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
1780: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1790: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
17a0: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
17b0: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
17c0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
17d0: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
17e0: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
17f0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1800: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1810: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1820: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1830: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
1840: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
1850: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
1860: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
1870: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
1880: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1890: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
18a0: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
18b0: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
18c0: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
18d0: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
18e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1900: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1930: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
1940: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
1950: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1970: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1980: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
1990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
19a0: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
19b0: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
19c0: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
19d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
19e0: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
19f0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1a00: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1a10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a20: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1a30: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
1a40: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
1a50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1a60: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
1a70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1a80: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1a90: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1aa0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1ab0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1ac0: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1ae0: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
1af0: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
1b00: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
1b10: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1b20: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
1b30: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
1b40: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
1b50: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
1b60: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
1b70: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
1b90: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ba0: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
1bb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1bc0: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
1bd0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
1be0: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
1bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1c00: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
1c10: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c20: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
1c30: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
1c40: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
1c50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
1c60: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
1c70: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
1c80: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1c90: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1ca0: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
1cb0: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
1cc0: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
1cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1ce0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1cf0: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
1d00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
1d10: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1d20: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
1d30: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
1d40: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1d50: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1d60: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
1d70: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
1d80: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1d90: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1da0: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1dc0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
1dd0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1de0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1df0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
1e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
1e10: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
1e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
1e30: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
1e40: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
1e50: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
1e60: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
1e70: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
1e80: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
1e90: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1ea0: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
1eb0: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
1ec0: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
1ed0: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
1ee0: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
1ef0: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
1f00: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
1f10: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
1f20: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
1f30: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
1f40: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
1f50: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
1f60: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
1f70: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
1f80: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
1f90: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
1fa0: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
1fb0: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
1fc0: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
1fd0: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
1fe0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2030: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
2040: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
2050: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2060: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
2070: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
2080: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
2090: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
20a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
20b0: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
20c0: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
20d0: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
20e0: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
20f0: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
2100: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
2110: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
2120: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
2130: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
2140: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
2150: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
2160: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
2170: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
2180: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
2190: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
21a0: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
21b0: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
2210: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2220: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
2230: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2240: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
2250: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
2260: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
2270: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2280: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2290: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
22a0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
22b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
22d0: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
22e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
22f0: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
2300: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2310: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_SIZE) * \.   
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
2350: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
2360: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
2370: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
2380: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
2390: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
23a0: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
23b0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
23c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23d0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
23e0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
23f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2400: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
2410: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2420: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
2430: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
2440: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
2450: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
2460: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
2470: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2480: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
2490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
24a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
24b0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
24c0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
24d0: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
24e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65  ./*.** The winMe
24f0: 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  mData structure 
2500: 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69  stores informati
2510: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74  on required by t
2520: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2530: 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d  c.** sqlite3_mem
2540: 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65  _methods impleme
2550: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  ntation..*/.type
2560: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65  def struct winMe
2570: 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61  mData winMemData
2580: 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  ;.struct winMemD
2590: 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ata {.#ifndef ND
25a0: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
25b0: 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  ;    /* Magic nu
25c0: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
25d0: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
25e0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ion. */.#endif. 
25f0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f   HANDLE hHeap; /
2600: 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20  * The handle to 
2610: 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42  our heap. */.  B
2620: 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20  OOL bOwned;  /* 
2630: 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65  Do we own the he
2640: 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79  ap (i.e. destroy
2650: 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29   it on shutdown)
2660: 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ? */.};..#ifndef
2670: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2680: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20  WINMEM_MAGIC    
2690: 20 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64   0x42b2830b.#end
26a0: 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  if..static struc
26b0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
26c0: 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69  _mem_data = {.#i
26d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57  fndef NDEBUG.  W
26e0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e  INMEM_MAGIC,.#en
26f0: 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53  dif.  NULL, FALS
2700: 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  E.};..#ifndef ND
2710: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e  EBUG.#define win
2720: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
2730: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2740: 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e  _data.magic==WIN
2750: 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73  MEM_MAGIC ).#els
2760: 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  e.#define winMem
2770: 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65  AssertMagic().#e
2780: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69  ndif..#define wi
2790: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77 69  nMemGetHeap() wi
27a0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70  n_mem_data.hHeap
27b0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ..static void *w
27c0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
27d0: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
27e0: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
27f0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73  void *pPrior);.s
2800: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
2810: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
2820: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
2830: 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  es);.static int 
2840: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
2850: 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  *p);.static int 
2860: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
2870: 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t n);.static int
2880: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
2890: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61   *pAppData);.sta
28a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
28b0: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
28c0: 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20  ppData);..const 
28d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
28e0: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
28f0: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23  etWin32(void);.#
2900: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2910: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
2920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2930: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
2940: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20   (normally) set 
2950: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63  once and never c
2960: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61  hanges.** therea
2970: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64  fter.  It record
2980: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70  s whether the op
2990: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
29a0: 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69  s Win9x.** or Wi
29b0: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20  nNT..**.** 0:   
29c0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
29d0: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20   unknown..** 1: 
29e0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
29f0: 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20  em is Win9x..** 
2a00: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  2:   Operating s
2a10: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a  ystem is WinNT..
2a20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74  **.** In order t
2a30: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73  o facilitate tes
2a40: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20  ting on a WinNT 
2a50: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74  system, the test
2a60: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20   fixture.** can 
2a70: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69  manually set thi
2a80: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20  s value to 1 to 
2a90: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65  emulate Win98 be
2aa0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65  havior..*/.#ifde
2ab0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ac0: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2ad0: 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  e = 0;.#else.sta
2ae0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
2af0: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e  os_type = 0;.#en
2b00: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53  dif..#ifndef SYS
2b10: 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53  CALL.#  define S
2b20: 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73  YSCALL sqlite3_s
2b30: 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69  yscall_ptr.#endi
2b40: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2b50: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
2b60: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
2b70: 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a  ws CE or WinRT..
2b80: 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
2b90: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
2ba0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64  TE_OS_WINRT.#  d
2bb0: 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41  efine osAreFileA
2bc0: 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20  pisANSI()       
2bd0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
2be0: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
2bf0: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
2c00: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
2c10: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
2c20: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
2c30: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
2c40: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
2c50: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
2c60: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
2c70: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
2c80: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
2c90: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
2ca0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
2cb0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
2cc0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
2cd0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
2ce0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2cf0: 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20   win_syscall {. 
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2d10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2d20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2d30: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2d40: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2d50: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2d60: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
2d70: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
2d80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2d90: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
2da0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
2db0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
2dc0: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
2dd0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2de0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2df0: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
2e00: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
2e10: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
2e20: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
2e30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2e40: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
2e50: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
2e60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2e80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
2e90: 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69  def osAreFileApi
2ea0: 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73  sANSI.#define os
2eb0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20  AreFileApisANSI 
2ec0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2ed0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30  VOID))aSyscall[0
2ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
2ef0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
2f00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
2f10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2f20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2f30: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
2f40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2f50: 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20  L)CharLowerW,   
2f60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2f70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c  #else.  { "CharL
2f80: 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  owerW",         
2f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2fc0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
2fd0: 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54  arLowerW ((LPWST
2fe0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
2ff0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  R))aSyscall[1].p
3000: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3010: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3030: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3040: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
3050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3060: 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65  SYSCALL)CharUppe
3070: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3080: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3090: 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20  "CharUpperW",   
30a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
30b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
30d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
30e0: 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28  e osCharUpperW (
30f0: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3100: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
3110: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
3120: 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65    { "CloseHandle
3130: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3140: 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e  SYSCALL)CloseHan
3150: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
3160: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3170: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42  sCloseHandle ((B
3180: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3190: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  DLE))aSyscall[3]
31a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
31b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
31c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
31d0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
31e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
31f0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3200: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
3210: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3220: 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20  CreateFileA",   
3230: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3240: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3260: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3270: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28   osCreateFileA (
3280: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3290: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57  (LPCSTR,DWORD,DW
32a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
32b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
32c0: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
32d0: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
32e0: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
32f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3300: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3310: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3320: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3330: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3340: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3350: 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20  reateFileW,     
3360: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3370: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3380: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3390: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
33c0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
33d0: 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28  eFileW ((HANDLE(
33e0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
33f0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
3400: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
3410: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
3420: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3440: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53  urrent)..#if (!S
3450: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3460: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3470: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3480: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34a0: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
34b0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
34c0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
34d0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
34e0: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
34f0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3500: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
3510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3540: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20  ateFileMappingA 
3560: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3570: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
3580: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
3590: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
35a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53  DWORD,DWORD,LPCS
35b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
35c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
35d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
35e0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
35f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3610: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
3620: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
3630: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20  TE_OMIT_WAL)).  
3640: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
3650: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
3660: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
3670: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
3680: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3690: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
36a0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
36b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
36c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
36d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36e0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
36f0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
3700: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
3710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3720: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
3730: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
3740: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
3750: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
3760: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3770: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3780: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3790: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
37a0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
37b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37c0: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
37d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37e0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
37f0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
3800: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3830: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3840: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
3850: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
3860: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3870: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
3880: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
3890: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
38a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
38b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
38c0: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
38d0: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
38e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
38f0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
3900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3910: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
3920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3960: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
3970: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
3980: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
3990: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
39a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
39b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
39c0: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
39d0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
39f0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3a10: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
3a20: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3a30: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3a60: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
3a70: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
3a80: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
3a90: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
3aa0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3ab0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
3ac0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3ad0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3ae0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
3af0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
3b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
3b10: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3b20: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
3b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3b50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
3b60: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3b70: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
3b80: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
3b90: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
3ba0: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
3bb0: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
3bc0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3bd0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
3be0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
3bf0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
3c00: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
3c10: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
3c20: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
3c30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
3c40: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
3c80: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3c90: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
3ca0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
3cb0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
3cc0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
3cd0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3ce0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
3cf0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
3d00: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
3d10: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
3d20: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3d30: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
3d40: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
3d50: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
3d60: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3d70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3d80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3d90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
3da0: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
3db0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3dc0: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
3dd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3de0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
3df0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
3e00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
3e40: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
3e50: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3e60: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
3e70: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3e80: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
3e90: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
3ea0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3eb0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3ec0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3ed0: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
3ee0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
3ef0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
3f00: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
3f10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3f20: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
3f30: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
3f40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3f70: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
3f80: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
3f90: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
3fa0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
3fb0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
3fc0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
3fd0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
3fe0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3ff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4000: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4010: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4020: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4030: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4040: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4060: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4080: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
40b0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
40c0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
40d0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
40e0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
40f0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4100: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4110: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4120: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4130: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4140: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4150: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4160: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4170: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4180: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4190: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
41a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
41b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
41c0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
41d0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
41e0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
41f0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4200: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4210: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4220: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4230: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4250: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4260: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4270: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4280: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4290: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
42a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
42b0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
42c0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
42d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
42e0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
42f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4310: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4320: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4330: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
4340: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
4350: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
4360: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4370: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
4380: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4390: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
43a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43b0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43c0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
43d0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
43e0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
43f0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4400: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4410: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4420: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
4430: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4440: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4450: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4460: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
4470: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4480: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
4490: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
44a0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
44b0: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
44c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
44e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
44f0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
4500: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
4510: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
4520: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
4530: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4550: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4560: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4570: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4580: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
4590: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
45a0: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
45b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
45c0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
45d0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
45e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4600: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4610: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
4620: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
4630: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
4640: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
4650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4660: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4670: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4680: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4690: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
46a0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
46b0: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
46c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
46d0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
46e0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
46f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4700: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4710: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4720: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4730: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
4740: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
4750: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
4760: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
4770: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
4780: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
4790: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
47a0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
47b0: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
47c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
47d0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
47e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
47f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
4800: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4810: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4840: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
4850: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
4860: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
4870: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
4880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4890: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
48a0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
48b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
48c0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
48d0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
48e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
48f0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
4900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4910: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4920: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
4930: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4960: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
4970: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
4980: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4990: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
49a0: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
49b0: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
49c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
49d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
49e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
49f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4a00: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4a10: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
4a20: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
4a30: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
4a40: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
4a50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4a60: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4a70: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
4a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4ab0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
4ac0: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
4ad0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4ae0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
4af0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
4b00: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
4b10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4b20: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
4b30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4b40: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
4b50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
4b70: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
4b80: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4b90: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
4ba0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
4bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4bc0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
4bd0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4be0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
4bf0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
4c00: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
4c10: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
4c20: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
4c30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4c40: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4c50: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4c60: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
4c80: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
4c90: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
4ca0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
4cb0: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
4cc0: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
4cd0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
4ce0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
4cf0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4d00: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
4d10: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
4d20: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
4d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4d40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
4d50: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
4d60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4d90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4da0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
4db0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
4dc0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
4dd0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
4de0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4df0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4e00: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
4e10: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
4e20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4e30: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
4e40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e50: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
4e60: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
4e70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4ea0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
4eb0: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
4ec0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
4ed0: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
4ee0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
4ef0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
4f00: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
4f10: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
4f20: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
4f30: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f40: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
4f50: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
4f60: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
4f70: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
4f80: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4f90: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4fa0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
4fb0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
4fc0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
4fd0: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
4fe0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
4ff0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5000: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5030: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5040: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5050: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5060: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5070: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5080: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5090: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
50a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
50b0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
50c0: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
50d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
50e0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
50f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5100: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5110: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5120: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5150: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5160: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5170: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5180: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5190: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
51a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
51b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
51c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
51d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
51e0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
51f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5200: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5210: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5220: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5230: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5240: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5270: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5280: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5290: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
52a0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
52b0: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
52c0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
52d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
52e0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
52f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5300: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5320: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5330: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
5340: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5370: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
5380: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
5390: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
53a0: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
53b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
53c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
53d0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56  _ANSI).  { "GetV
53e0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
53f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5400: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5410: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5420: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5430: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5440: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5470: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
5480: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
5490: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
54a0: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
54b0: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
54c0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
54d0: 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20  { "HeapAlloc",  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
54f0: 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c  SCALL)HeapAlloc,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5510: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
5520: 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  eapAlloc ((LPVOI
5530: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
5540: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
5550: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
5560: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5570: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5580: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
5590: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
55a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
55b0: 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20  HeapCreate,     
55c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
55d0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65  lse.  { "HeapCre
55e0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
55f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5620: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5630: 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28  Create ((HANDLE(
5640: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53  WINAPI*)(DWORD,S
5650: 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20  IZE_T, \.       
5660: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5670: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
5680: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5690: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44  WINRT.  { "HeapD
56a0: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
56b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
56c0: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
56d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
56e0: 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  e.  { "HeapDestr
56f0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
5700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5730: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65  #define osHeapDe
5740: 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e  stroy ((BOOL(WIN
5750: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5760: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
5770: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46  ent)..  { "HeapF
5780: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
5790: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
57a0: 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  apFree,         
57b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
57c0: 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20  fine osHeapFree 
57d0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
57e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
57f0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38  OID))aSyscall[38
5800: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5810: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20   "HeapReAlloc", 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5830: 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63  CALL)HeapReAlloc
5840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5850: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5860: 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  apReAlloc ((LPVO
5870: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
5880: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  LE,DWORD,LPVOID,
5890: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
58a0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  T))aSyscall[39].
58b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
58c0: 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20  HeapSize",      
58d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
58e0: 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20  LL)HeapSize,    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5910: 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49  Size ((SIZE_T(WI
5920: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5930: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
5940: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
5950: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
5960: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5970: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61  INRT.  { "HeapVa
5980: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
5990: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
59a0: 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20  pValidate,      
59b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
59c0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
59d0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
59e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5a10: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c  define osHeapVal
5a20: 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e  idate ((BOOL(WIN
5a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5a40: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5a50: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
5a60: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
5a70: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5a80: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
5ac0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
5ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ae0: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
5af0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
5b10: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
5b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5b60: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
5b70: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
5b80: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
5b90: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5bb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5bc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5bd0: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
5be0: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
5bf0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5c00: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
5c10: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
5c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
5c30: 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20  oadLibraryW,    
5c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5c50: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
5c60: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
5c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
5cb0: 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c  ibraryW ((HMODUL
5cc0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
5cd0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d  TR))aSyscall[43]
5ce0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5cf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5d00: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
5d10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d20: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72  (SYSCALL)LocalFr
5d30: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
5d40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5d50: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5d70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5d90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5da0: 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28  ne osLocalFree (
5db0: 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29  (HLOCAL(WINAPI*)
5dc0: 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c  (HLOCAL))aSyscal
5dd0: 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[44].pCurrent).
5de0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5df0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
5e00: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5e10: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
5e20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e30: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
5e40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
5e60: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5e70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5ea0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
5eb0: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
5ec0: 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  sLockFile ((BOOL
5ed0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5ee0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5ef0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
5f00: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  ORD))aSyscall[45
5f10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
5f20: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
5f30: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
5f40: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
5f50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5f60: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
5f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f80: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
5f90: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
5fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5fd0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
5fe0: 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20  kFileEx.#define 
5ff0: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  osLockFileEx ((B
6000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6010: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6020: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6030: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6040: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36  PED))aSyscall[46
6050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6060: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
6070: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
6080: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6090: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
60a0: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
60b0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
60c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60d0: 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  LL)MapViewOfFile
60e0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
60f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56  .#else.  { "MapV
6100: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6110: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6130: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6140: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d  dif..#define osM
6150: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
6160: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6170: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6180: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6190: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
61a0: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
61b0: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
61c0: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
61d0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
61e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
61f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6200: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
6210: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
6220: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
6230: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
6240: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
6250: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  nt))aSyscall[48]
6260: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6270: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
6280: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
6290: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
62a0: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
62b0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
62c0: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
62d0: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
62e0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
62f0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
6300: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
6310: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
6320: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
6330: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6340: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
6350: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6360: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
6370: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6380: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
6390: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
63a0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
63b0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
63c0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  50].pCurrent).. 
63d0: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
63e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
63f0: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
6400: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6410: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6420: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
6430: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6440: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  DLE))aSyscall[51
6450: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6460: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6470: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
6480: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6490: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
64a0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
64c0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
64d0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
64e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6500: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6510: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6520: 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e  nter ((DWORD(WIN
6530: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e  API*)(HANDLE,LON
6540: 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20  G,PLONG, \.     
6550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6560: 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[52].pCurrent)
6570: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6580: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65  _WINRT.  { "Slee
6590: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
65a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
65b0: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
65c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
65d0: 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  se.  { "Sleep", 
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6620: 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70  .#define osSleep
6630: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6640: 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  (DWORD))aSyscall
6650: 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [53].pCurrent)..
6660: 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54    { "SystemTimeT
6670: 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28  oFileTime",    (
6680: 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69  SYSCALL)SystemTi
6690: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20  meToFileTime,   
66a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
66b0: 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
66c0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
66d0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54  API*)(CONST SYST
66e0: 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  EMTIME*, \.     
66f0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
6700: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
6710: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6720: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
6730: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6740: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
6750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6760: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
6770: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6780: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6790: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
67a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
67d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
67e0: 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23  f osUnlockFile.#
67f0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
6800: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6810: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6820: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6830: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6840: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
6850: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6860: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6870: 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  CE.  { "UnlockFi
6880: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6890: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
68a0: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
68b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
68c0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
68d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
68e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6910: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
6920: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
6930: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6940: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6950: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6960: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
6970: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6980: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
6990: 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  E || !defined(SQ
69a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
69b0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
69c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
69d0: 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77  YSCALL)UnmapView
69e0: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
69f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a00: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
6a10: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
6a20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6a50: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
6a60: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6a70: 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73  *)(LPCVOID))aSys
6a80: 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e  call[57].pCurren
6a90: 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61  t)..  { "WideCha
6aa0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20  rToMultiByte",  
6ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65     (SYSCALL)Wide
6ac0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c  CharToMultiByte,
6ad0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6ae0: 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d  ne osWideCharToM
6af0: 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57  ultiByte ((int(W
6b00: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6b10: 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c  RD,LPCWSTR,int,L
6b20: 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20  PSTR,int, \.    
6b30: 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f      LPCSTR,LPBOO
6b40: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e  L))aSyscall[58].
6b50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6b60: 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20  WriteFile",     
6b70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b80: 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20  LL)WriteFile,   
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6ba0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ..#define osWrit
6bb0: 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eFile ((BOOL(WIN
6bc0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43  API*)(HANDLE,LPC
6bd0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
6be0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6bf0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
6c00: 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e  call[59].pCurren
6c10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6c20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
6c30: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
6c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6c50: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
6c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6c70: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
6c80: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
6c90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6cc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6cd0: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
6ce0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
6cf0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
6d00: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
6d10: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
6d20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  D))aSyscall[60].
6d30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6d40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6d50: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
6d60: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
6d70: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
6d80: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
6d90: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6da0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
6db0: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
6dc0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6de0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6df0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
6e00: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
6e10: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6e20: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
6e30: 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70  ))aSyscall[61].p
6e40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e60: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
6e70: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
6e80: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
6e90: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
6ea0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
6eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6ec0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
6ed0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ef0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6f00: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
6f10: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
6f20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6f30: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6f40: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
6f50: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
6f60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6f70: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
6f80: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
6f90: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
6fa0: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
6fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6fc0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
6fd0: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
6fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7010: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7020: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
7030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7040: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
7050: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
7060: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
7070: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
7080: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7090: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
70a0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
70b0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
70c0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
70d0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
70e0: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
70f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7100: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7110: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7140: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
7150: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7160: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7170: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
7180: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
7190: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
71a0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
71b0: 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72  Syscall[64].pCur
71c0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
71d0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
71e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
71f0: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70  IT_WAL).  { "Map
7200: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7210: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
7220: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
7230: 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65  mApp,    0 },.#e
7240: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
7250: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7260: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7290: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
72a0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
72b0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
72c0: 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c  *)(HANDLE,ULONG,
72d0: 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20  ULONG64, \.     
72e0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
72f0: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7300: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7310: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
7320: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7330: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
7340: 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20  reateFile2,     
7350: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7360: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
7370: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
7380: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
73b0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
73c0: 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28  eFile2 ((HANDLE(
73d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
73e0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
73f0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
7400: 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
7410: 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
7420: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
7430: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7440: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
7450: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7460: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
7470: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61  ION).  { "LoadPa
7480: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7490: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
74a0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
74b0: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
74c0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
74d0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
74e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7510: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
7520: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
7530: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
7540: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
7550: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7560: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
7570: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7580: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
7590: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
75a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
75b0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
75c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
75d0: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
75e0: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
75f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7620: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
7630: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
7640: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
7650: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d  ID))aSyscall[68]
7660: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7680: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
7690: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
76a0: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
76b0: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
76c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
76d0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
76e0: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
76f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7720: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
7730: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
7740: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
7750: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
7760: 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70  ))aSyscall[69].p
7770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
7780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7790: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
77a0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
77b0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
77c0: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
77d0: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
77e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
77f0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7800: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7840: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7850: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
7860: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
7870: 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e  call[70].pCurren
7880: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
7890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
78a0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
78b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
78c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
78d0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
78e0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
78f0: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7900: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
7910: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7940: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
7950: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
7960: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
7970: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
7980: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  71].pCurrent).. 
7990: 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65   { "GetProcessHe
79a0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  ap",          (S
79b0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73  YSCALL)GetProces
79c0: 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20  sHeap,          
79d0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
79e0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
79f0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7a00: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
7a10: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
7a20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7a30: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
7a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
7a50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
7a60: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
7a70: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7a80: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
7a90: 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  p, 0 },.#else.  
7aa0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
7ab0: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
7ac0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7ae0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7af0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7b00: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28  MappingFromApp (
7b10: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7b20: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
7b30: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
7b40: 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55  TRIBUTES,ULONG,U
7b50: 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29  LONG64,LPCWSTR))
7b60: 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75  aSyscall[73].pCu
7b70: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
7b80: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
7b90: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
7ba0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
7bb0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
7bc0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
7bd0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
7be0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
7bf0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
7c00: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7c10: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
7c20: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
7c30: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
7c40: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
7c50: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
7c60: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
7c70: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
7c80: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
7c90: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
7ca0: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
7cb0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
7cc0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
7cd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
7ce0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
7cf0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7d00: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
7d10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7d20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
7d30: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
7d40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
7d50: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
7d60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
7d70: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
7d80: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
7d90: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
7da0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
7db0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
7dc0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7dd0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
7de0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
7df0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
7e00: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
7e10: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
7e20: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
7e30: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
7e40: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
7e50: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
7e60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
7e70: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7e80: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7e90: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
7eb0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
7ed0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7ee0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
7ef0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
7f00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7f10: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
7f20: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
7f30: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
7f40: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
7f50: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
7f60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
7f70: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7f80: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7f90: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7fb0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7fe0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7ff0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
8000: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8010: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
8020: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8030: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
8040: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8060: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8070: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8080: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8090: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
80a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
80b0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
80c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
80d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
80e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
80f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
8100: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
8110: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
8120: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
8130: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
8140: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
8150: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
8160: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
8170: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
8180: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8190: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
81a0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
81b0: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
81c0: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
81d0: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
81e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
81f0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
8200: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
8210: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8220: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
8230: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
8240: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
8250: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
8260: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
8270: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8280: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8290: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
82a0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
82b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
82c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
82e0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
82f0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
8300: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
8310: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
8320: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
8330: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
8340: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8350: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
8360: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
8370: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
8380: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
8390: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
83a0: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
83b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
83c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
83d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
83e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
83f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
8400: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
8410: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
8420: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
8430: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
8440: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
8450: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8460: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
8470: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
8480: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
8490: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
84a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
84b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
84c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
84d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
84e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
84f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
8500: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8510: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8520: 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63  outputs the spec
8530: 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72  ified (ANSI) str
8540: 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ing to the Win32
8550: 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66   debugger.** (if
8560: 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
8570: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69  .void sqlite3_wi
8580: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
8590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66  const char *zBuf
85a0: 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63  , int nBuf){.  c
85b0: 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49  har zDbgBuf[SQLI
85c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
85d0: 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d  _SIZE];.  int nM
85e0: 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28  in = MIN(nBuf, (
85f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8600: 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b  _BUF_SIZE - 1));
8610: 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74   /* may be negat
8620: 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d  ive. */.  if( nM
8630: 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d  in<-1 ) nMin = -
8640: 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69  1; /* all negati
8650: 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65  ve values become
8660: 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74   -1. */.  assert
8670: 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d  ( nMin==-1 || nM
8680: 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51  in==0 || nMin<SQ
8690: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
86a0: 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64  UF_SIZE );.#if d
86b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
86c0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
86d0: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
86e0: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
86f0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8700: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8710: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
8720: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
8730: 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65  ;.    osOutputDe
8740: 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42  bugStringA(zDbgB
8750: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
8760: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
8770: 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20  tringA(zBuf);.  
8780: 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  }.#elif defined(
8790: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
87a0: 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28  _WIDE).  memset(
87b0: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
87c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
87d0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f  _SIZE);.  if ( o
87e0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
87f0: 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20  Char(.          
8800: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
8810: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
8820: 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66  P_OEMCP, 0, zBuf
8830: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e  ,.          nMin
8840: 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75  , (LPWSTR)zDbgBu
8850: 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  f, SQLITE_WIN32_
8860: 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a  DBG_BUF_SIZE/siz
8870: 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29  eof(WCHAR))<=0 )
8880: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8890: 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75  }.  osOutputDebu
88a0: 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54  gStringW((LPCWST
88b0: 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73  R)zDbgBuf);.#els
88c0: 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29  e.  if( nMin>0 )
88d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62  {.    memset(zDb
88e0: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
88f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
8900: 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ZE);.    memcpy(
8910: 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e  zDbgBuf, zBuf, n
8920: 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Min);.    fprint
8930: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
8940: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
8950: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
8960: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75  tderr, "%s", zBu
8970: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
8980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8990: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75  owing routine su
89a0: 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65  spends the curre
89b0: 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74  nt thread for at
89c0: 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c   least ms.** mil
89d0: 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73  liseconds.  This
89e0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
89f0: 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65  o the Win32 Slee
8a00: 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  p() interface..*
8a10: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
8a20: 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e  WINRT.static HAN
8a30: 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e  DLE sleepObj = N
8a40: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69  ULL;.#endif..voi
8a50: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
8a60: 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c  sleep(DWORD mill
8a70: 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53  iseconds){.#if S
8a80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8a90: 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d   if ( sleepObj==
8aa0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65  NULL ){.    slee
8ab0: 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45  pObj = osCreateE
8ac0: 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55  ventExW(NULL, NU
8ad0: 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54  LL, CREATE_EVENT
8ae0: 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20  _MANUAL_RESET,. 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8b10: 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d  YNCHRONIZE);.  }
8b20: 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70  .  assert( sleep
8b30: 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f  Obj!=NULL );.  o
8b40: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
8b50: 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c  jectEx(sleepObj,
8b60: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46   milliseconds, F
8b70: 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  ALSE);.#else.  o
8b80: 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f  sSleep(milliseco
8b90: 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  nds);.#endif.}..
8ba0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
8bb0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
8bc0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
8bd0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
8be0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
8bf0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
8c00: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
8c10: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
8c20: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
8c30: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
8c40: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
8c50: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
8c60: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
8c70: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
8c80: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
8c90: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
8ca0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
8cb0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
8cc0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
8cd0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
8ce0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
8cf0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
8d00: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8d10: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8d20: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
8d30: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
8d40: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
8d50: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
8d60: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
8d70: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
8d80: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
8d90: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
8da0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8db0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
8dc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65  TE_OS_WINRT.# de
8dd0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
8de0: 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  1).#elif !define
8df0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8e00: 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e  AS_WIDE).# defin
8e10: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a  e osIsNT()  (0).
8e20: 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69  #else.  static i
8e30: 6e 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b  nt osIsNT(void){
8e40: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8e50: 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  _os_type==0 ){. 
8e60: 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e       OSVERSIONIN
8e70: 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20  FOA sInfo;.     
8e80: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
8e90: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
8ea0: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
8eb0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
8ec0: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  A(&sInfo);.     
8ed0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
8ee0: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
8ef0: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
8f00: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
8f10: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
8f20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
8f30: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
8f40: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
8f50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8f60: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
8f70: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
8f80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
8f90: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
8fa0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
8fb0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
8fc0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
8fd0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
8fe0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
8ff0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
9000: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
9010: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9020: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9030: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9040: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9050: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9060: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
9070: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
9080: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
9090: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
90a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
90b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
90c0: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
90d0: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
90e0: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
90f0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9100: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
9110: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
9120: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
9130: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9140: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
9150: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
9160: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
9170: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9180: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
9190: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
91a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
91b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
91c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
91d0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
91e0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
91f0: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
9200: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
9210: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
9220: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
9230: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
9240: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
9260: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
9270: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
9280: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9290: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
92a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
92b0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
92c0: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
92d0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
92e0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
92f0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
9300: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
9310: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20  Prior ) return; 
9320: 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20  /* Passing NULL 
9330: 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75  to HeapFree is u
9340: 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69  ndefined. */.  i
9350: 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68  f( !osHeapFree(h
9360: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9370: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
9380: 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71  Prior) ){.    sq
9390: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
93a0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
93b0: 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63  to HeapFree bloc
93c0: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
93d0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
93e0: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
93f0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9400: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9410: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
9420: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
9430: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
9440: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
9450: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
9460: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
9470: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
9480: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
9490: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
94a0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
94b0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
94c0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
94d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
94e0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
94f0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9500: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9510: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9520: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9530: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9540: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9550: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
9560: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
9570: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9580: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
9590: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
95a0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
95b0: 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  );.  if( !pPrior
95c0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65   ){.    p = osHe
95d0: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
95e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
95f0: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
9600: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65  nBytes);.  }else
9610: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
9620: 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  ReAlloc(hHeap, S
9630: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9640: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20  _FLAGS, pPrior, 
9650: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
9660: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b  .  }.  if( !p ){
9670: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
9680: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
9690: 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20  failed to %s %u 
96a0: 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70  bytes (%d), heap
96b0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
96c0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
96d0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
96e0: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
96f0: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
9700: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
9710: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
9720: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
9730: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
9740: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
9750: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
9760: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
9770: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
9780: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
9790: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
97a0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
97b0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
97c0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
97d0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
97e0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
97f0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
9800: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
9810: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9820: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9830: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9850: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
9860: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
9870: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
9880: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9890: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
98a0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
98b0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
98c0: 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70   0;.  n = osHeap
98d0: 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Size(hHeap, SQLI
98e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
98f0: 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e  AGS, p);.  if( n
9900: 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a  ==(SIZE_T)-1 ){.
9910: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9920: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
9930: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a  ailed to HeapSiz
9940: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
9950: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9960: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
9970: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9980: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9990: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
99a0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
99b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
99c0: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
99d0: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
99e0: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
99f0: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
9a00: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
9a10: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
9a20: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
9a30: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
9a40: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
9a50: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
9a60: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
9a70: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
9a80: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
9a90: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
9aa0: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
9ab0: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
9ac0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9ad0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
9ae0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49  mData->magic==WI
9af0: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23  NMEM_MAGIC );..#
9b00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9b10: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
9b20: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a  N32_HEAP_CREATE.
9b30: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9b40: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
9b50: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
9b60: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
9b70: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
9b80: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
9bc0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
9c00: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
9c10: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
9c20: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
9c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9c40: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9c50: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
9c60: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
9c70: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
9c80: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
9c90: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
9ca0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
9cb0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
9cc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
9cd0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9ce0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
9cf0: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
9d00: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
9d10: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
9d20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9d30: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
9d40: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
9d50: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
9d60: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9d70: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
9d80: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
9d90: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
9da0: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
9db0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
9dc0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
9dd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9de0: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
9df0: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
9e00: 6f 63 65 73 73 48 65 61 70 20 28 25 64 29 22 2c  ocessHeap (%d)",
9e10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9e20: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
9e30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9e40: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
9e50: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
9e60: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
9e70: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
9e80: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
9e90: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9ea0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9eb0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
9ec0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
9ed0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9ee0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9ef0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9f00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9f10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9f20: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
9f30: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
9f40: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
9f50: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9f60: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
9f70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
9f80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9f90: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
9fa0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
9fb0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
9fc0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
9fd0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
9fe0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
9ff0: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
a000: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
a010: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
a020: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
a030: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
a040: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
a050: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
a060: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
a070: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
a080: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
a090: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
a0a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
a0b0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
a0d0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
a0e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
a0f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
a100: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
a110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
a120: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a130: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
a140: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
a150: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
a160: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
a170: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a180: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a190: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
a1a0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
a1d0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69  or(), (void*)pWi
a1e0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
a1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a200: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a210: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ned = FALSE;.   
a220: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
a230: 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c  ta->hHeap = NULL
a240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
a250: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
a260: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
a270: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
a280: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
a290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
a2a0: 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74  fig.m with point
a2b0: 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69  ers to the routi
a2c0: 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
a2d0: 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  . The.** argumen
a2e0: 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62  ts specify the b
a2f0: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
a300: 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o manage..**.** 
a310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a320: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
a330: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c  qlite3_config(),
a340: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a   and therefore.*
a350: 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
a360: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
a370: 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a  fe (it is not)..
a380: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
a390: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
a3a0: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
a3b0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
a3c0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
a3d0: 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65  em_methods winMe
a3e0: 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  mMethods = {.   
a3f0: 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20   winMemMalloc,. 
a400: 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20     winMemFree,. 
a410: 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63     winMemRealloc
a420: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65  ,.    winMemSize
a430: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e  ,.    winMemRoun
a440: 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49  dup,.    winMemI
a450: 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  nit,.    winMemS
a460: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69  hutdown,.    &wi
a470: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a  n_mem_data.  };.
a480: 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d    return &winMem
a490: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64  Methods;.}..void
a4a0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
a4b0: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
a4c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
a4d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
a4e0: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
a4f0: 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e  tWin32());.}.#en
a500: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
a510: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
a520: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
a530: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d  TF-8 string to M
a540: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
a550: 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a   (UTF-16?). .**.
a560: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a570: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a580: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a590: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
a5a0: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77  .static LPWSTR w
a5b0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
a5c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
a5d0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
a5e0: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
a5f0: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
a600: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
a610: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
a620: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
a630: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
a640: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
a650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a660: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
a670: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
a680: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
a690: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
a6a0: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
a6b0: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
a6c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a6d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
a6e0: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
a6f0: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
a700: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
a710: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
a720: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
a750: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
a760: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a770: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
a780: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
a790: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a7a0: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
a7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
a7c0: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
a7d0: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
a7e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
a7f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
a800: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
a810: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
a820: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
a830: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
a840: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
a850: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
a860: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
a870: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
a880: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
a890: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
a8a0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
a8b0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
a8c0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
a8d0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a8e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a8f0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
a900: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
a910: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
a920: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
a930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a940: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a950: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
a960: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
a970: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a980: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
a990: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
a9c0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a9d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a9e0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
a9f0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
aa00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
aa10: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
aa20: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
aa30: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
aa40: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
aa50: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
aa60: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
aa70: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
aa80: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
aa90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
aaa0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
aab0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
aac0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
aad0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
aae0: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
aaf0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
ab00: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
ab10: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
ab20: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
ab30: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
ab40: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
ab50: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
ab60: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
ab70: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
ab80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
ab90: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
aba0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
abb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
abe0: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
abf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ac00: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
ac10: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
ac20: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
ac30: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
ac40: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
ac50: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
ac60: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
ac70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
ac80: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
ac90: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
aca0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
acb0: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
acc0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
acf0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
ad00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ad10: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
ad20: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
ad30: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
ad40: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
ad50: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
ad60: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
ad70: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
ad80: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
ad90: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
ada0: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
adb0: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
adc0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
add0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
ade0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
adf0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
ae00: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
ae10: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e  atic char *winUn
ae20: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
ae30: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
ae40: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
ae50: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
ae60: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
ae70: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
ae80: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
ae90: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
aea0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
aeb0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
aec0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
aed0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
aee0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
aef0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
af00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
af10: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
af20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
af30: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
af40: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
af50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
af60: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
af70: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
af80: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
af90: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
afa0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  -1, zFilename,. 
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
afd0: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
afe0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
aff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b000: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
b010: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
b020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
b030: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
b040: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
b050: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
b060: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
b070: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
b080: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
b090: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
b0a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
b0b0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
b0c0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
b0d0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
b0e0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
b0f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
b100: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57  enameUtf8;.  LPW
b110: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
b120: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d   zTmpWide = winM
b130: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  bcsToUnicode(zFi
b140: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
b150: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
b160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b170: 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20    zFilenameUtf8 
b180: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
b190: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
b1a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
b1b0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
b1c0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
b1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
b1e0: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
b1f0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
b200: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
b210: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
b220: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
b230: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
b240: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
b250: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
b260: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
b270: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
b280: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
b290: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
b2a0: 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  s;.  LPWSTR zTmp
b2b0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
b2c0: 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  e = winUtf8ToUni
b2d0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
b2e0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
b2f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b300: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
b310: 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69  ameMbcs = winUni
b320: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
b330: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
b340: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
b350: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
b360: 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meMbcs;.}../*.**
b370: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
b380: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
b390: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
b3a0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
b3b0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
b3c0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
b3d0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
b3e0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
b3f0: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
b400: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
b410: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
b420: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
b430: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
b440: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
b450: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
b460: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b470: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
b480: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
b490: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
b4a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
b4b0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
b4c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
b4d0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
b4e0: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
b4f0: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
b500: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
b510: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
b520: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
b530: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
b540: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
b550: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
b560: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
b570: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
b580: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
b590: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
b5a0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
b5b0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
b5c0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
b5d0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
b5e0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
b5f0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
b600: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
b610: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
b620: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
b630: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
b640: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
b650: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
b660: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
b670: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
b680: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
b690: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
b6a0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
b6b0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
b6c0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
b6d0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
b6e0: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
b6f0: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
b700: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
b710: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
b720: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
b730: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
b740: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
b750: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
b760: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
b770: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
b780: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
b790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b7a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b7b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
b7c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44  qlite3_free(*ppD
b7d0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a  irectory);.    *
b7e0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56  ppDirectory = zV
b7f0: 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65  alueUtf8;.    re
b800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b820: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
b830: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
b840: 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61  alue of winGetLa
b850: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
b860: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
b870: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
b880: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
b890: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
b8a0: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
b8b0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
b8c0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
b8d0: 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
b8e0: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
b8f0: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
b900: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
b910: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
b920: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
b930: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
b940: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
b950: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
b960: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
b970: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
b980: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
b990: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
b9a0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
b9b0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
b9c0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
b9d0: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
b9e0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
b9f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ba00: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
ba10: 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49  mpWide[SQLITE_WI
ba20: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
ba30: 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c  HARS+1];.    dwL
ba40: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
ba50: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
ba60: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
ba70: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
baa0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
bad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
baf0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
bb40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
bb60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
bb70: 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20  ERRMSG_CHARS,.  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
bba0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
bbb0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
bbc0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
bbd0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
bbe0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
bbf0: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
bc20: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
bc30: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
bc60: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
bc70: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
bce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
bd00: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
bd10: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
bd60: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
bd70: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
bd80: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
bd90: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
bda0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
bdb0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bdc0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
bdd0: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
bde0: 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  8(zTempWide);.  
bdf0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
be00: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69  nignMalloc();.#i
be10: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
be20: 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  RT.      /* free
be30: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
be40: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
be50: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
be60: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
be70: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23  ee(zTempWide);.#
be80: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
be90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
bea0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
beb0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
bec0: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
bed0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
bee0: 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54  tMessageA(FORMAT
bef0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
bf00: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
bf30: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
bf40: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
bf70: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
bfa0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
c010: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
c060: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
c070: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
c080: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
c090: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
c0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
c0b0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
c0c0: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
c0d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
c0e0: 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
c0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c100: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
c110: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  );.      /* free
c120: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
c130: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
c140: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
c150: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
c160: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ee(zTemp);.    }
c170: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
c180: 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a  ( 0 == dwLen ){.
c190: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c1a0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
c1b0: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20   "OsError 0x%lx 
c1c0: 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e  (%lu)", lastErrn
c1d0: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
c1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
c1f0: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
c200: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
c210: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
c220: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c230: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
c240: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
c250: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
c260: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
c270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
c280: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
c290: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
c2a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
c2b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
c2c0: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
c2d0: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
c2e0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
c2f0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
c300: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c310: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
c320: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
c330: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
c340: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
c350: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
c360: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
c370: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
c380: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
c390: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
c3a0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
c3b0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
c3c0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
c3d0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
c3e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
c3f0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
c400: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
c410: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
c420: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
c430: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
c440: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
c450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
c460: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
c470: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
c480: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
c490: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
c4a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
c4b0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
c4c0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
c4d0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
c4e0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
c4f0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
c500: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
c510: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
c520: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
c530: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
c540: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
c550: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
c560: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
c590: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
c5a0: 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
c5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
c5c0: 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
c5d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c5e0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c5f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c600: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c610: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c620: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c640: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c650: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c660: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c690: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c6a0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c6b0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
c6c0: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
c6d0: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
c6e0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
c6f0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c720: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
c730: 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
c740: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
c750: 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
c760: 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
c770: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
c780: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
c790: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
c7a0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
c7b0: 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
c7c0: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
c7d0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
c7e0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
c7f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
c800: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
c810: 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
c820: 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
c830: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
c840: 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
c850: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
c860: 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
c870: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
c880: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
c890: 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
c8a0: 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
c8b0: 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
c8c0: 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
c8d0: 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
c8e0: 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
c8f0: 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
c900: 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61   caused by .** a
c910: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
c920: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
c930: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
c940: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
c950: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
c960: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
c970: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
c980: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
c990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c9a0: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
c9b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c9c0: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
c9d0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
c9e0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c9f0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
ca00: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
ca10: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
ca20: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
ca30: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
ca40: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
ca50: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
ca60: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
ca70: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
ca80: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
ca90: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
caa0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  ;../*.** If a Re
cab0: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
cac0: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
cad0: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
cae0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
caf0: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
cb00: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
cb10: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
cb20: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
cb30: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
cb40: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
cb50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
cb60: 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  RetryIoerr(int *
cb70: 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a  pnRetry, DWORD *
cb80: 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44  pError){.  DWORD
cb90: 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
cba0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e  ror();.  if( *pn
cbb0: 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52  Retry>=winIoerrR
cbc0: 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20  etry ){.    if( 
cbd0: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
cbe0: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20  *pError = e;.   
cbf0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
cc00: 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52  .  }.  if( e==ER
cc10: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
cc20: 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  D ||.      e==ER
cc30: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
cc40: 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ON ||.      e==E
cc50: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
cc60: 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  LATION ){.    sq
cc70: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
cc80: 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  p(winIoerrRetryD
cc90: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
cca0: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
ccb0: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
ccc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
ccd0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
cce0: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
ccf0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cd00: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
cd10: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
cd20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
cd30: 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
cd40: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
cd50: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
cd60: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
cd70: 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c  ERR, .      "del
cd80: 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f  ayed %dms for lo
cd90: 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c  ck/sharing confl
cda0: 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49  ict",.      winI
cdb0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
cdc0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
cdd0: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
cde0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
cdf0: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
ce00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
ce40: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
ce50: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
ce60: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
ce70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ce80: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
ce90: 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
cea0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
ceb0: 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65  ME_API./*.** The
cec0: 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e   MSVC CRT on Win
ced0: 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20  dows CE may not 
cee0: 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
cef0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
cf00: 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62  .** create a sub
cf10: 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
cf20: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
cf30: 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
cf40: 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
cf50: 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
cf60: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
cf70: 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
cf80: 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
cf90: 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
cfa0: 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
cfb0: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
cfc0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
cfd0: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
cfe0: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
cff0: 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
d000: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
d010: 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
d020: 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
d030: 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
d040: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
d050: 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
d060: 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
d070: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
d080: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
d090: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
d0a0: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
d0b0: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
d0c0: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
d0d0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
d0e0: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
d0f0: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
d100: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
d110: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
d120: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
d130: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
d140: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
d150: 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
d160: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
d170: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
d180: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
d190: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
d1a0: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
d1b0: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
d1c0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
d1d0: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
d1e0: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
d1f0: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
d200: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
d210: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
d220: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
d230: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
d240: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
d250: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
d260: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
d270: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
d280: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
d290: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
d2a0: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
d2b0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
d2c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
d2d0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
d2e0: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
d2f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
d300: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
d310: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
d320: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
d330: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
d340: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
d350: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
d360: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
d370: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
d380: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
d390: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
d3a0: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
d3b0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
d3c0: 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
d3d0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
d3e0: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
d3f0: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
d400: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d410: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d420: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
d430: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
d440: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
d450: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
d460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
d470: 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c  ialize the local
d480: 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d   lockdata */.  m
d490: 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f  emset(&pFile->lo
d4a0: 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  cal, 0, sizeof(p
d4b0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a  File->local));..
d4c0: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
d4d0: 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f   backslashes fro
d4e0: 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  m the filename a
d4f0: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a  nd lowercase it.
d500: 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61    ** to derive a
d510: 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   mutex name. */.
d520: 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c    zTok = osCharL
d530: 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  owerW(zName);.  
d540: 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b  for (;*zTok;zTok
d550: 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54  ++){.    if (*zT
d560: 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f  ok == '\\') *zTo
d570: 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20  k = '_';.  }..  
d580: 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74  /* Create/open t
d590: 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a  he named mutex *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65  /.  pFile->hMute
d5b0: 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65  x = osCreateMute
d5c0: 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20  xW(NULL, FALSE, 
d5d0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70  zName);.  if (!p
d5e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
d5f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d600: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
d610: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
d620: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
d630: 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
d640: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d650: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
d660: 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c  eateLock1", zFil
d670: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  ename);.    sqli
d680: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
d690: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d6a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20  TE_IOERR;.  }.. 
d6b0: 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
d6c0: 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e  mutex before con
d6d0: 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  tinuing */.  win
d6e0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
d6f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d700: 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65   .  /* Since the
d710: 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
d720: 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
d730: 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
d740: 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a  gs etc are .  **
d750: 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c   case-sensitive,
d760: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
d770: 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72  of that by upper
d780: 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  casing the mutex
d790: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75   name.  ** and u
d7a0: 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65  sing that as the
d7b0: 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70   shared filemapp
d7c0: 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  ing name..  */. 
d7d0: 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e   osCharUpperW(zN
d7e0: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
d7f0: 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74  Shared = osCreat
d800: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e  eFileMappingW(IN
d810: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
d820: 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  UE, NULL,.      
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
d860: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
d870: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
d8b0: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
d8c0: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
d8d0: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
d8e0: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
d8f0: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
d900: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
d910: 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
d920: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
d930: 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
d940: 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
d950: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
d960: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
d970: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
d980: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
d990: 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
d9a0: 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
d9b0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
d9c0: 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
d9d0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
d9e0: 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
d9f0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
da00: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
da10: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
da20: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
da30: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
da40: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
da50: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
da60: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
da70: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
da80: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
da90: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
daa0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
dab0: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
dac0: 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
dad0: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
dae0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
daf0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
db00: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
db10: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
db20: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
db30: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
db40: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
db50: 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
db60: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
db70: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
db80: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
db90: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
dba0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
dbb0: 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
dbc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
dbd0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
dbe0: 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
dbf0: 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
dc00: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
dc10: 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
dc20: 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
dc30: 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
dc40: 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
dc50: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dc60: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
dc70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
dc80: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
dc90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
dcb0: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
dcc0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
dcd0: 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
dce0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
dcf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
dd00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
dd10: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
dd20: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
dd30: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
dd40: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
dd50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
dd60: 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  OERR;.  }.  .  /
dd70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
dd80: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
dd90: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
dda0: 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e   to */.  if( bIn
ddb0: 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it ){.    memset
ddc0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
ddd0: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
dde0: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
ddf0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
de00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
de10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  OK;.}../*.** Des
de30: 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66  troy the part of
de40: 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65   winFile that de
de50: 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c  als with wince l
de60: 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ocks.*/.static v
de70: 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79  oid winceDestroy
de80: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
de90: 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c  ile){.  if (pFil
dea0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
deb0: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
dec0: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
ded0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
dee0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
def0: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
df00: 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c  ing blocks shoul
df10: 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72  d probably asser
df20: 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  t in debug mode,
df30: 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20   but they.      
df40: 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20   are to cleanup 
df50: 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b  in case any lock
df60: 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20  s remained open 
df70: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
df80: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
df90: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
dfa0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
dfb0: 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   --;.    }.    i
dfc0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
dfd0: 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20  bReserved){.    
dfe0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
dff0: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
e000: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
e010: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
e020: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
e030: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e040: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
e050: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
e060: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
e070: 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70  lusive){.      p
e080: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
e090: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
e0a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e0b0: 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64  De-reference and
e0c0: 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20   close our copy 
e0d0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  of the shared me
e0e0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  mory handle */. 
e0f0: 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66     osUnmapViewOf
e100: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
e110: 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ed);.    osClose
e120: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
e130: 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  hared);..    /* 
e140: 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
e150: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
e160: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
e170: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20  le->hMutex);    
e180: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
e190: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
e1a0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
e1b0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
e1c0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
e1d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
e1e0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
e1f0: 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
e200: 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
e210: 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  OOL winceLockFil
e220: 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
e230: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
e240: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
e250: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
e260: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
e270: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e280: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
e290: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
e2a0: 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
e2b0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
e2c0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
e2d0: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
e2e0: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
e2f0: 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  SE;..  UNUSED_PA
e300: 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66  RAMETER(dwFileOf
e310: 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55  fsetHigh);.  UNU
e320: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
e330: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e340: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
e350: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
e360: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
e370: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
e380: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e390: 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61  ..  /* Wanting a
e3a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e3b0: 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  ? */.  if (dwFil
e3c0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
e3d0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
e3e0: 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d  T.       && nNum
e3f0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e400: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
e410: 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
e420: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
e430: 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  d->nReaders == 0
e440: 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65   && pFile->share
e450: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
e460: 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c   0){.       pFil
e470: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
e480: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
e490: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e4a0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  l.bExclusive = T
e4b0: 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74  RUE;.       bRet
e4c0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e4d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
e4e0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63   a read-only loc
e4f0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
e500: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e510: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e520: 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
e530: 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42        nNumberOfB
e540: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
e550: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
e560: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
e570: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
e580: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e590: 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  .nReaders ++;.  
e5a0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
e5b0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
e5c0: 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69   1){.        pFi
e5d0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e5e0: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d  ders ++;.      }
e5f0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e600: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e610: 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65  ..  /* Want a pe
e620: 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  nding lock? */. 
e630: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
e640: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e650: 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
e660: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
e670: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
e680: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
e690: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69    /* If no pendi
e6a0: 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
e6b0: 20 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20   acquired, then 
e6c0: 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20  acquire it */.  
e6d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
e6e0: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d  red->bPending ==
e6f0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
e700: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
e710: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
e720: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e730: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
e740: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e750: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e760: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73  .  /* Want a res
e770: 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  erved lock? */. 
e780: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
e790: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e7a0: 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
e7b0: 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
e7c0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e7d0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
e7e0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
e7f0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
e800: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
e810: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
e820: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
e830: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e840: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
e850: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
e860: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e870: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
e880: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
e890: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
e8a0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
e8b0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
e8c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
e8d0: 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57  ockFile API of W
e8e0: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
e8f0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
e900: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  ceUnlockFile(.  
e910: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
e920: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
e930: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
e940: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
e950: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
e960: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e970: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
e980: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
e990: 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
e9a0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
e9b0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
e9c0: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
e9d0: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
e9e0: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
e9f0: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
ea00: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
ea10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
ea20: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
ea30: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
ea40: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
ea50: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
ea60: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
ea70: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
ea80: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
ea90: 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
eaa0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
eab0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
eac0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
ead0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
eae0: 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
eaf0: 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
eb00: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
eb10: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
eb20: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
eb30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
eb40: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
eb50: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
eb60: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
eb70: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
eb80: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
eb90: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
eba0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
ebb0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
ebc0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
ebd0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
ebe0: 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
ebf0: 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
ec00: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
ec10: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ec20: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
ec30: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
ec40: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ec50: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
ec60: 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20  ARED_SIZE.      
ec70: 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65         || nNumbe
ec80: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ec90: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
eca0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
ecb0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
ecc0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ecd0: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
ece0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
ecf0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
ed00: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
ed10: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
ed20: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
ed30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
ed40: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
ed50: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
ed60: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
ed70: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
ed80: 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
ed90: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
eda0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
edb0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
edc0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
edd0: 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
ede0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
edf0: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
ee00: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
ee10: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
ee20: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
ee30: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
ee40: 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69    }.  /* Releasi
ee50: 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ng a reserved lo
ee60: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
ee70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
ee80: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
ee90: 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
eea0: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
eeb0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
eec0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
eed0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
eee0: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
eef0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
ef00: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
ef10: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
ef20: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
ef30: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
ef40: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
ef50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
ef60: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
ef70: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
ef80: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
ef90: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
efa0: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
efb0: 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
f010: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
f020: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  E */../*.** Lock
f030: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
f040: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
f050: 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  inLockFile(.  LP
f060: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
f070: 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20   DWORD flags,.  
f080: 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
f090: 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
f0a0: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
f0b0: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
f0c0: 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
f0d0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
f0e0: 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
f0f0: 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
f100: 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
f110: 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
f120: 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
f130: 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
f140: 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a    API LockFile..
f150: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
f160: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
f170: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
f180: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
f1b0: 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
f1c0: 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
f1d0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
f1e0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
f1f0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
f200: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
f210: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
f220: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
f230: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
f240: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
f250: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
f260: 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
f270: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
f280: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
f290: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
f2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f2b0: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
f2c0: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
f2d0: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
f2e0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
f310: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
f320: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
f330: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
f340: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
f350: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
f360: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
f370: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
f380: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
f390: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
f3a0: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
f3b0: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
f3c0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
f3d0: 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
f3e0: 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
f3f0: 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
f400: 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
f410: 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
f420: 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
f430: 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
f440: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
f450: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
f460: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
f470: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
f4a0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
f4b0: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
f4c0: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
f4d0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
f4e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
f4f0: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
f500: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
f510: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
f520: 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
f530: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
f540: 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
f550: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
f560: 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c  leEx(*phFile, 0,
f570: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
f580: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
f590: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
f5a0: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
f5b0: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
f5c0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
f5d0: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
f5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f5f0: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
f600: 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
f610: 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dif.}../********
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f660: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
f670: 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
f680: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
f690: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
f6a0: 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
f6b0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
f6c0: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f720: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
f730: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
f740: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
f750: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
f760: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
f770: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
f780: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f790: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
f7a0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
f7b0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
f7c0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
f7d0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
f7e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f7f0: 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
f800: 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
f810: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
f820: 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
f830: 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
f840: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
f850: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f860: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
f870: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
f880: 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  int winSeekFile(
f890: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
f8a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
f8b0: 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c  ffset){.#if !SQL
f8c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c  ITE_OS_WINRT.  L
f8d0: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8f0: 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
f900: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
f910: 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
f920: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f930: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
f940: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
f950: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f960: 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
f990: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
f9a0: 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44  ter() */.  DWORD
f9b0: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
f9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f9d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f9e0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
f9f0: 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  /..  OSTRACE(("S
fa00: 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66  EEK file=%p, off
fa10: 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69  set=%lld\n", pFi
fa20: 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29  le->h, iOffset))
fa30: 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d  ;..  upperBits =
fa40: 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74   (LONG)((iOffset
fa50: 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
fa60: 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  ff);.  lowerBits
fa70: 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65   = (LONG)(iOffse
fa80: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
fa90: 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74  ..  /* API oddit
faa0: 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  y: If successful
fab0: 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  , SetFilePointer
fac0: 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f  () returns a dwo
fad0: 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  rd .  ** contain
fae0: 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
faf0: 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
fb00: 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
fb10: 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
fb20: 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
fb30: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
fb40: 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
fb50: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
fb60: 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  DN, .  ** INVALI
fb70: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
fb80: 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
fb90: 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
fba0: 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
fbb0: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
fbc0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63   an error has ac
fbd0: 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c  tually occurred,
fbe0: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
fbf0: 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
fc00: 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
fc10: 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
fc20: 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
fc30: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
fc40: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
fc50: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
fc60: 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
fc70: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
fc80: 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
fc90: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
fca0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
fcb0: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
fcc0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
fcd0: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
fce0: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
fcf0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
fd00: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
fd10: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fd20: 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
fd30: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
fd40: 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
fd50: 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
fd60: 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
fd70: 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
fd80: 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
fd90: 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
fda0: 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
fdb0: 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
fdc0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
fdd0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
fde0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
fdf0: 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
fe00: 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
fe10: 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
fe20: 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
fe30: 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
fe40: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
fe50: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
fe60: 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
fe70: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
fe90: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
fea0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
feb0: 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
fec0: 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
fed0: 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
fee0: 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
fef0: 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
ff00: 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
ff10: 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
ff20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
ff30: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ff40: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
ff50: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
ff60: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ff70: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ff80: 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
ff90: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
ffa0: 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
ffb0: 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
ffc0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
ffd0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
ffe0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
fff0: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
10000 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
10010 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
10020 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
10030 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  n 0;.#endif.}..#
10040 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10050 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72  AP_SIZE>0./* For
10060 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
10070 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
10080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10090 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
100a0 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
100b0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
100c0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
100d0 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
100e0 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
100f0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
10100 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
10110 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
10120 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
10130 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
10140 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
10150 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
10160 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
10170 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
10180 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
10190 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
101a0 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
101b0 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
101c0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
101d0 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
101e0 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
101f0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
10200 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
10210 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
10220 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
10230 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
10240 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
10250 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
10260 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
10270 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
10280 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
10290 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
102a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
102b0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
102c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
102d0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
102e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
102f0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
10300 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
10310 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10320 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
10330 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
10340 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
10350 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
10360 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
10370 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
10380 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
10390 45 3e 30 0a 20 20 72 63 20 3d 20 77 69 6e 55 6e  E>0.  rc = winUn
103a0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
103b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
103c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
103d0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
103e0 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
103f0 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
10400 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
10410 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
10420 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
10430 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
10440 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
10450 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
10460 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
10470 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
10480 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
10490 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
104a0 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
104b0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
104c0 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
104d0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
104e0 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
104f0 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
10500 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
10510 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
10520 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
10530 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
10540 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
10550 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
10560 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
10570 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
10580 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
10590 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
105a0 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
105b0 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
105c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
105d0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
105e0 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
105f0 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
10600 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
10610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10620 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
10630 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
10640 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
10650 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
10660 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
10670 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
10680 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
10690 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
106a0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20   pFile->h, rc ? 
106b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
106c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
106d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
106e0 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
106f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10700 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
10710 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
10740 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
10750 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
10760 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
10770 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
10780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10790 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
107a0 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
107b0 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
107c0 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
107d0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
107e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
107f0 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
10800 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
10810 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
10820 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
10830 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
10840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10850 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
10860 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
10870 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10890 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
108a0 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
108b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
108c0 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
108d0 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
108e0 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
108f0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10900 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
10910 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
10920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
10930 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
10940 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
10950 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10960 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
10970 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
10980 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
109b0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
109c0 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
109d0 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
109e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
10a00 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
10a10 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
10a20 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
10a30 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
10a40 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
10a50 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
10a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10a70 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
10a80 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75  READ file=%p, bu
10a90 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
10aa0 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
10ab0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
10ac0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
10ad0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
10ae0 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
10af0 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
10b00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
10b10 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
10b20 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
10b30 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
10b40 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
10b50 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
10b60 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
10b70 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
10b80 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
10b90 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
10ba0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
10bb0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
10bc0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
10bd0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
10be0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
10bf0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
10c00 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
10c10 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  ], amt);.      O
10c20 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d  STRACE(("READ-MM
10c30 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
10c40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
10c50 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
10c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10c80 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
10c90 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
10ca0 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
10cb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
10cc0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
10cd0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
10ce0 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
10cf0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
10d00 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
10d10 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
10d20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
10d30 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
10d40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
10d50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
10d60 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65  NCE.  if( winSee
10d70 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
10d80 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
10d90 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
10da0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
10db0 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  LL\n", pFile->h)
10dc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10dd0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
10de0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
10df0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
10e00 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
10e10 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
10e20 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
10e30 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
10e40 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
10e50 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
10e60 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
10e70 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
10e80 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10e90 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
10ea0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
10eb0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
10ec0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
10ed0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
10ee0 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
10ef0 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
10f00 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
10f10 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
10f20 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
10f30 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
10f40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
10f50 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
10f60 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
10f70 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
10f80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10f90 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
10fa0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
10fb0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
10fc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10fd0 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
10fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
10ff0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11000 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
11010 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11020 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
11030 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
11040 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f  th);.  }.  winLo
11050 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
11060 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
11070 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
11080 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
11090 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
110a0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
110b0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
110c0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
110d0 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
110e0 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  d);.    OSTRACE(
110f0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
11100 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
11110 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70  SHORT_READ\n", p
11120 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11140 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
11150 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
11160 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
11170 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
11180 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
11190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
111a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
111b0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
111c0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
111d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
111e0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
111f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
11200 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
11210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11220 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
11230 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11250 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
11260 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
11270 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
11280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
11290 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
112a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
112d0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
112e0 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
112f0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11310 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
11320 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
11330 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
11340 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11360 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
11370 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
11380 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
11390 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
113a0 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
113b0 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
113c0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
113f0 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
11400 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
11410 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11420 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11430 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
11440 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
11450 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
11460 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
11470 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
11480 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
11490 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
114a0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73   amount=%d, offs
114b0 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
114c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
114d0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
114e0 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
114f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
11500 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
11510 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
11520 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
11530 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
11540 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
11550 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
11560 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
11570 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
11580 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
11590 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
115a0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
115b0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
115c0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
115d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
115e0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
115f0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
11600 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
11610 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
11620 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
11630 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c  ("WRITE-MMAP fil
11640 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11650 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
11660 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11680 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11690 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
116a0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
116b0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
116c0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
116d0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
116e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
116f0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
11700 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
11710 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
11720 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
11730 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
11740 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
11750 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
11760 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11770 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65  rc = winSeekFile
11780 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b  (pFile, offset);
11790 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
117a0 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66  #else.  {.#endif
117b0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
117c0 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41  WINCE.    OVERLA
117d0 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
117e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
117f0 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
11800 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
11810 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
11820 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
11830 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
11840 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
11850 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
11860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
11880 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
11890 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
118a0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
118b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
118c0 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
118d0 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
118e0 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
118f0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
11900 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
11910 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
11920 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
11930 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
11940 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74  WINCE.    memset
11950 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
11960 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
11970 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  ED));.    overla
11980 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
11990 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
119a0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f  ffffffff);.    o
119b0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
119c0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
119d0 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
119e0 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
119f0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
11a00 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  m>0 ){.#if SQLIT
11a10 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
11a20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
11a30 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
11a40 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
11a50 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
11a60 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
11a70 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
11a80 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
11a90 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
11aa0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
11ab0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
11ac0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
11ad0 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
11ae0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
11af0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11b00 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
11b10 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
11b20 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
11b30 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
11b40 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
11b50 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
11b60 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
11b70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11b80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11b90 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
11ba0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
11bb0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
11bc0 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
11bd0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
11be0 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
11bf0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
11c00 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
11c10 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
11c20 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
11c30 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
11c40 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
11c50 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
11c60 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
11c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
11c80 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
11c90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11ca0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
11cb0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
11cc0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
11cd0 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
11ce0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
11cf0 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
11d00 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
11d10 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
11d20 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
11d30 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
11d40 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
11d50 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11d60 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c  TE_FULL\n", pFil
11d70 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
11d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
11da0 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
11db0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
11dc0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
11dd0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11de0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
11df0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
11e00 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
11e10 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11e20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c       "winWrite",
11e30 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e    }else{.    win
11e50 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  LogIoerr(nRetry)
11e60 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
11e70 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
11e80 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
11e90 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
11ec0 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
11ed0 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
11ee0 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
11ef0 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
11f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11f10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
11f20 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
11f30 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11f40 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
11f50 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
11f60 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11f70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
11f80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11f90 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
11fa0 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
11fb0 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
11fc0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11fd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11fe0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
11ff0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
12000 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
12010 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 73 69  CATE file=%p, si
12020 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  ze=%lld, lock=%d
12030 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12040 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
12050 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12060 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
12070 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
12080 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
12090 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
120a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
120b0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
120c0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
120d0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
120e0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
120f0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
12100 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
12110 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
12120 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
12130 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
12140 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
12150 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
12160 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
12170 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
12180 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
12190 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
121a0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
121b0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
121c0 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
121d0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
121e0 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
121f0 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
12200 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
12210 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
12220 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
12230 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
12240 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12250 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
12260 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
12290 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
122a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
122b0 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
122c0 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20  File->h) &&.    
122d0 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72          ((lastEr
122e0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
122f0 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55  rror())!=ERROR_U
12300 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29  SER_MAPPED_FILE)
12310 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12320 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12330 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77  rrno;.    rc = w
12340 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12350 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
12360 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
12370 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12380 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
12390 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
123a0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66  zPath);.  }..#if
123b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
123c0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20  _SIZE>0.  /* If 
123d0 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75  the file was tru
123e0 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
123f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
12400 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
12410 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
12420 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
12430 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
12440 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
12450 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20  e will.  ** use 
12460 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
12470 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
12480 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
12490 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
124a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
124b0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26  e->pMapRegion &&
124c0 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
124d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46  apSize ){.    pF
124e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
124f0 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  nByte;.  }.#endi
12500 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  f..  OSTRACE(("T
12510 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c  RUNCATE file=%p,
12520 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
12530 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
12540 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
12550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
12560 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
12570 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
12580 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
12590 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
125a0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
125b0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
125c0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
125d0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
125e0 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
125f0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
12600 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
12610 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
12620 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
12630 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
12640 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
12650 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
12660 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
12670 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
12680 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
12690 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
126a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
126b0 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
126c0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
126d0 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
126e0 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
126f0 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
12700 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
12710 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
12720 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
12730 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
12740 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
12750 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e   || \.    (defin
12760 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
12770 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
12780 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20  E_DEBUG)).  /*. 
12790 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51   ** Used when SQ
127a0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
127b0 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20  not defined and 
127c0 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20  by the assert() 
127d0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52  and/or.  ** OSTR
127e0 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  ACE() macros..  
127f0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
12800 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
12810 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
12820 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
12830 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
12840 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12850 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
12860 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
12870 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
12880 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
12890 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
128a0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
128b0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
128c0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
128d0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
128e0 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
128f0 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
12900 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
12910 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
12920 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
12930 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
12940 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
12950 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
12960 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
12970 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
12980 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
12990 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
129a0 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
129b0 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66  "SYNC file=%p, f
129c0 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64  lags=%x, lock=%d
129d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
129e0 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c  pFile->h, flags,
129f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12a00 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
12a10 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
12a20 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
12a30 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
12a40 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
12a50 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
12a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
12a70 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
12a80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
12a90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
12aa0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
12ab0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
12ac0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
12ad0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
12ae0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
12af0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
12b00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
12b10 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
12b20 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  OP file=%p, rc=S
12b30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12b40 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
12b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
12b60 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
12b70 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
12b80 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
12b90 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
12ba0 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
12bb0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
12bc0 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72  "SYNC file=%p, r
12bd0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
12be0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12c10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12c20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12c30 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  ();.    OSTRACE(
12c40 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
12c50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12c60 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65 2d  FSYNC\n", pFile-
12c70 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12c80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12c90 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
12ca0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12cb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12cc0 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
12cd0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
12ce0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
12cf0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
12d00 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
12d10 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
12d20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
12d30 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
12d40 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
12d50 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
12d60 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12d70 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
12d80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d90 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
12da0 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
12db0 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
12dc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12dd0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
12de0 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
12df0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
12e00 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
12e10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
12e20 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
12e30 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
12e40 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
12e50 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
12e60 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
12e70 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
12e80 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
12e90 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
12ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
12ed0 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
12ee0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
12ef0 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
12f00 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
12f10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12f20 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
12f30 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
12f40 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
12f50 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12f60 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
12f70 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
12fa0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12fb0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
12fc0 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
12fd0 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
12fe0 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
12ff0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13000 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
13010 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
13020 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
13030 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
13040 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
13050 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
13060 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
13070 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
13080 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
13090 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
130a0 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
130b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
130c0 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
130d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
130e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
130f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
13100 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
13110 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
13120 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
13130 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13140 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
13150 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13160 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13170 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
13180 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
13190 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
131a0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
131b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
131c0 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
131d0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
131e0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
131f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
13200 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
13210 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
13220 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
13230 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
13240 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
13250 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
13260 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
13270 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
13280 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
13290 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
132a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
132b0 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
132c0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
132d0 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
132e0 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
132f0 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
13300 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
13310 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
13320 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
13330 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
13340 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
13350 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
13360 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
13370 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
13380 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
13390 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
133a0 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
133b0 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
133c0 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
133d0 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
133e0 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
133f0 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
13400 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
13410 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
13420 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
13430 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
13440 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
13450 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
13460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
13470 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
13480 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
13490 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
134a0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
134b0 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
134e0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
134f0 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
13500 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
13510 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
13520 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
13530 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
13540 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
13550 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
13560 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
13570 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
13580 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
13590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
135a0 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
135b0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
135c0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
135d0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
135e0 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
135f0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
13600 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
13610 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
13620 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
13630 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
13640 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13650 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
13660 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
13670 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
13680 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
13690 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
136a0 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
136b0 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
136c0 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
136d0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
136e0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
136f0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
13700 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13710 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
13720 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
13730 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
13740 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
13750 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
13760 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
13770 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
13780 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
13790 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
137a0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
137b0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
137c0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
137d0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
137e0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
137f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
13800 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
13810 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
13830 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
13840 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
13850 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
13860 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
13870 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
13880 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
13890 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
138a0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
138b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
138c0 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
138d0 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
138e0 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
138f0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
13900 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
13910 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
13920 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
13930 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
13940 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
13950 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
13960 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
13970 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
13980 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
13990 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
139a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
139b0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
139c0 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
139d0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
139e0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
139f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
13a00 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
13a10 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
13a20 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  res)));.  return
13a30 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
13a40 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
13a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13a60 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
13a70 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
13a80 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
13a90 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
13aa0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
13ab0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
13ac0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
13ad0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
13ae0 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
13af0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
13b00 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
13b10 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
13b20 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
13b30 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
13b40 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13b50 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
13b60 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
13b70 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
13b80 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
13b90 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
13ba0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
13bb0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
13bc0 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
13bd0 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
13be0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13bf0 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
13c00 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
13c10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13c20 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13c30 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13c40 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
13c50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13c60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13c70 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f  "winUnlockReadLo
13c80 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
13c90 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  h);.  }.  OSTRAC
13ca0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
13cb0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
13cc0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
13cd0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
13ce0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
13cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13d00 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13d10 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
13d20 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
13d30 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
13d40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
13d60 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
13d70 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
13d80 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
13d90 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
13da0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
13db0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
13dc0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
13dd0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
13de0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
13df0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
13e00 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
13e10 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
13e20 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
13e30 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
13e40 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
13e50 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
13e60 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
13e70 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
13e80 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
13e90 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
13ea0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
13eb0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
13ec0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
13ed0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
13ee0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
13ef0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
13f00 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
13f10 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
13f20 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13f30 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
13f40 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
13f50 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13f60 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
13f70 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13f80 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13f90 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
13fa0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
13fb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
13fc0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
13fd0 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
13fe0 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
13ff0 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
14000 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
14010 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
14020 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
14030 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
14040 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
14050 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
14060 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
14070 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
14080 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
14090 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
140a0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
140b0 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
140c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
140d0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
140e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
140f0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
14100 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
14110 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
14120 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
14130 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14140 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
14150 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
14160 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
14170 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
14180 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
14190 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
141a0 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
141b0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
141c0 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
141d0 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
141e0 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
141f0 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
14200 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14210 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
14220 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
14230 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
14240 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
14250 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d  ACE(("LOCK file=
14260 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25  %p, oldLock=%d(%
14270 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e  d), newLock=%d\n
14280 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14290 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
142a0 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
142b0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
142c0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
142d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
142e0 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
142f0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
14300 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
14310 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
14320 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
14330 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
14340 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
14350 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
14360 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
14370 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14380 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14390 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
143a0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
143b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
143c0 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20  K-HELD file=%p, 
143d0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
143e0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
143f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14400 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
14410 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
14420 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
14430 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
14440 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
14450 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
14460 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
14470 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
14480 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
14490 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
144a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
144b0 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
144c0 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
144d0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
144e0 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
144f0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
14500 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
14510 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
14520 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
14530 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
14540 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
14550 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
14560 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
14570 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
14580 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
14590 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
145a0 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
145b0 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
145c0 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28  ktype;.  if(   (
145d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
145e0 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c  =NO_LOCK).     |
145f0 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d  | (   (locktype=
14600 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
14610 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46  .         && (pF
14620 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
14630 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20  ESERVED_LOCK)). 
14640 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
14650 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
14660 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
14670 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
14680 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
14690 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47           PENDING
146d0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
146e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
146f0 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
14700 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
14710 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ock.  This is ne
14720 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20  eded to work.   
14730 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f     ** around pro
14740 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
14750 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20  indexing and/or 
14760 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77  anti-virus softw
14770 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  are on.      ** 
14780 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
14790 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75  .      ** If you
147a0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
147b0 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20  code as a model 
147c0 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  for alternative 
147d0 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20  VFSes, do not.  
147e0 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73      ** copy this
147f0 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49   retry logic.  I
14800 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65  t is a hack inte
14810 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73  nded for Windows
14820 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a   only..      */.
14830 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
14840 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49  LOCK-PENDING-FAI
14850 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
14860 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
14880 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c  ile->h, cnt, sql
14890 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
148a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  ));.      if( cn
148b0 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t ) sqlite3_win3
148c0 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  2_sleep(1);.    
148d0 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
148e0 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
148f0 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
14900 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
14910 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
14920 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14930 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
14940 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
14950 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
14960 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
14970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
14980 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
14990 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
149a0 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63   = winGetReadLoc
149b0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
149c0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
149d0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
149e0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
149f0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
14a00 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14a10 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
14a20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
14a30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
14a50 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
14a60 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
14a70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14a80 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
14a90 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
14aa0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
14ab0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
14ac0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
14ad0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14ae0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
14af0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
14b00 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
14b10 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
14b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
14b30 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14b40 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14b50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
14b60 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
14b70 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
14b80 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
14b90 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
14ba0 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
14bb0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
14bc0 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
14bd0 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
14be0 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
14bf0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
14c00 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
14c10 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14c20 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
14c30 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
14c40 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  cktype>=SHARED_L
14c50 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
14c60 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
14c70 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72  ck(pFile);.    r
14c80 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
14c90 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
14ca0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
14cb0 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
14cc0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14cd0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
14ce0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
14cf0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
14d00 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
14d10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
14d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
14d30 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14d40 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14d50 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63     winGetReadLoc
14d60 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
14d70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
14d80 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
14d90 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
14da0 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
14db0 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
14dc0 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
14dd0 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
14de0 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
14df0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14e00 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
14e10 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14e20 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
14e30 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
14e40 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
14e50 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
14e60 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
14e70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
14e80 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
14e90 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
14ea0 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
14eb0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
14ec0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14ed0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
14ee0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14ef0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
14f00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14f10 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41  _BUSY;.    OSTRA
14f20 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66  CE(("LOCK-FAIL f
14f30 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25  ile=%p, wanted=%
14f40 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20  d, got=%d\n",.  
14f50 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14f60 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e  ->h, locktype, n
14f70 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
14f80 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
14f90 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
14fa0 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
14fb0 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
14fc0 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
14fd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
14fe0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
14ff0 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
15000 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
15010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15020 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15030 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
15040 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
15050 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
15060 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
15070 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
15080 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
15090 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
150a0 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
150b0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
150c0 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
150d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
150e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
150f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15100 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15110 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69  {.  int rc;.  wi
15120 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
15130 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
15140 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15160 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
15170 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54  EDLOCK; );.  OST
15180 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15190 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
151a0 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  sOut=%p\n", pFil
151b0 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b  e->h, pResOut));
151c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
151d0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
151e0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
151f0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
15200 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
15210 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
15220 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
15230 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
15240 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
15250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15260 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
15270 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
15280 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
15290 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
152a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
152b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e   rc ){.      win
152c0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
152d0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
152e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
152f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
15300 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  c;.    OSTRACE((
15310 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
15320 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65  le=%p, rc=%d (re
15330 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
15340 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20  >h, rc));.  }.  
15350 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
15360 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
15370 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
15380 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
15390 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
153a0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
153b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
153c0 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
153d0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
153e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
15400 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
15410 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
15420 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
15430 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
15440 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
15450 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
15460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
15470 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
15480 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
154a0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
154b0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
154c0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
154d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
154e0 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
154f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
15500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
15510 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
15520 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
15530 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
15540 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15550 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
15560 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
15570 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
15580 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15590 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
155a0 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
155b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
155c0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
155d0 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
155e0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
155f0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
15600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15610 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
15620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
15630 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
15640 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
15650 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
15660 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
15670 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
15680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15690 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
156a0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
156b0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
156c0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70  ocktype));.  typ
156d0 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
156e0 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
156f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15700 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
15710 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
15720 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
15730 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
15740 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
15750 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
15760 26 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f  && !winGetReadLo
15770 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
15780 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
15790 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
157a0 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
157b0 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
157c0 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
157d0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
157e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
157f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15800 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
15810 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15830 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
15840 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15850 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
15860 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
15870 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
15880 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
15890 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
158a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
158b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
158c0 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
158d0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
158e0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
158f0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
15900 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
15910 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
15920 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15930 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
15940 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
15950 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
15960 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
15970 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
15980 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
15990 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
159a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
159b0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
159c0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
159d0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
159e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
159f0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
15a00 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
15a10 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
15a20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
15a30 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
15a40 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
15a50 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
15a60 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
15a70 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
15a80 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
15a90 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
15aa0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
15ab0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
15ac0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
15ad0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
15ae0 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
15af0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
15b00 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
15b10 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
15b20 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
15b30 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
15b40 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
15b50 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
15b60 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
15b70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
15b80 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
15b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
15ba0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
15bb0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
15bc0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15bd0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
15be0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
15bf0 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
15c00 72 20 2a 7a 42 75 66 29 3b 0a 23 69 66 20 53 51  r *zBuf);.#if SQ
15c10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
15c20 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
15c30 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69  winMapfile(winFi
15c40 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
15c50 36 34 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  64);.#endif../*.
15c60 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
15c70 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
15c80 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
15c90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
15ca0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
15cb0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15cc0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
15cd0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
15ce0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
15cf0 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
15d00 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
15d10 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
15d20 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
15d30 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
15d40 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
15d50 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
15d60 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
15d70 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
15d80 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
15d90 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
15da0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
15db0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
15dc0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
15dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15de0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
15df0 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
15e00 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
15e10 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29  nt*)pArg = (int)
15e20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15e30 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15e40 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15e50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15e60 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15e70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15e80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
15e90 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
15ea0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
15eb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
15ec0 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
15ed0 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  Arg;.      OSTRA
15ee0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
15ef0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15f00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
15f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15f30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
15f40 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
15f50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  {.      if( pFil
15f60 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
15f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15f80 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20  int64 oldSz;.   
15f90 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
15fa0 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f  nFileSize(id, &o
15fb0 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ldSz);.        i
15fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15fe0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
15ff0 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
16000 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
16010 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f       if( newSz>o
16020 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ldSz ){.        
16030 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16040 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
16050 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
16060 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e  inTruncate(id, n
16070 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ewSz);.         
16080 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16090 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
160a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
160b0 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41   }.        OSTRA
160c0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
160d0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
160e0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
160f0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16100 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
16120 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
16130 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16140 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
16150 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
16160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
16170 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
16180 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
16190 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69  _WAL: {.      wi
161a0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
161b0 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
161c0 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
161d0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
161e0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
161f0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16200 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16220 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
16230 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
16240 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
16250 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77  WRITE: {.      w
16260 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  inModeBit(pFile,
16270 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28   WINFILE_PSOW, (
16280 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
16290 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
162a0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
162b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
162c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
162d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
162e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
162f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
16300 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
16310 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
16320 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 77 69  ite3_mprintf("wi
16330 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 4f 53 54  n32");.      OST
16340 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
16350 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
16360 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
16370 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
16390 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
163a0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
163b0 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
163c0 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
163d0 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
163e0 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
163f0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
16400 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
16410 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
16420 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
16430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16440 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
16450 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
16460 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
16470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16480 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
16490 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
164a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
164b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
164c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
164d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
164e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
164f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16500 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
16510 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
16520 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
16530 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c  ar *zTFile = sql
16540 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
16550 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
16560 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20  athname );.     
16570 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20   if( zTFile ){. 
16580 20 20 20 20 20 20 20 77 69 6e 47 65 74 54 65 6d         winGetTem
16590 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
165a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
165b0 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
165c0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
165d0 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
165e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
165f0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
16600 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
16610 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
16620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16630 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
16640 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
16650 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
16660 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
16670 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
16680 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
16690 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
166a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
166b0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
166c0 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
166d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
166e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
166f0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
16700 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
16710 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
16720 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
16730 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
16740 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
16750 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
16760 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
16770 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
16780 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
16790 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
167a0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
167b0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
167c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
167d0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
167e0 20 20 20 20 20 20 28 76 6f 69 64 29 77 69 6e 55        (void)winU
167f0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
16800 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16810 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
16820 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
16830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
16840 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
16850 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 5c 6e 22  ile=%p, rc=%d\n"
16860 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29  , pFile->h, rc))
16870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16880 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
16890 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
168a0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
168b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
168c0 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
168d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
168e0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
168f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16900 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
16910 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
16920 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
16930 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
16940 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
16950 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
16960 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
16970 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
16980 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
16990 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
169a0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
169b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
169c0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
169d0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
169e0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
169f0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
16a00 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
16a10 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
16a20 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
16a30 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
16a40 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
16a50 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
16a60 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
16a70 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
16a80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
16a90 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
16aa0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
16ab0 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
16ac0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
16ad0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
16ae0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
16af0 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
16b00 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
16b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16b20 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
16b30 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
16b40 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
16b50 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
16b60 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
16b70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
16b80 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
16b90 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
16ba0 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
16bb0 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
16bc0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
16bd0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
16be0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  ;.}../* .** Wind
16bf0 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
16c00 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
16c10 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
16c20 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
16c30 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
16c40 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
16c50 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
16c60 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
16c70 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
16c80 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
16c90 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
16ca0 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
16cb0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
16cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16cd0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
16ce0 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
16cf0 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
16d00 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
16d10 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
16d20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
16d30 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
16d40 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
16d50 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
16d60 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
16d70 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
16d80 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
16d90 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
16da0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
16db0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
16dc0 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
16dd0 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
16de0 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
16df0 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
16e00 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
16e10 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
16e20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
16e30 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
16e40 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
16e50 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
16e60 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
16e70 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
16e80 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
16e90 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
16ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
16eb0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
16ec0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
16ed0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
16ee0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16ef0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
16f00 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
16f10 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
16f20 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
16f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
16f40 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
16f50 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16f60 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
16f70 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
16f80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
16f90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
16fa0 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
16fb0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
16fc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
16fd0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
16fe0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
16ff0 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
17000 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
17010 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
17020 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
17030 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
17040 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
17050 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
17060 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
17070 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
17080 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
17090 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
170a0 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
170b0 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
170c0 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
170d0 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
170e0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
170f0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
17100 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
17110 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
17120 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
17130 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
17140 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
17150 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
17160 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
17170 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
17180 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
17190 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
171a0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
171b0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
171c0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
171d0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
171e0 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
171f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17200 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
17210 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
17220 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
17230 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
17240 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
17250 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
17260 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
17270 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
17280 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
17290 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
172a0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
172b0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
172c0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
172d0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
172e0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
172f0 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
17300 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
17310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
17320 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
17330 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
17340 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
17350 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
17360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17370 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
17380 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
17390 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
173a0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
173b0 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
173c0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
173d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
173e0 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
173f0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
17400 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17420 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
17430 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
17440 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
17450 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
17460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17470 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
17480 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
17490 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
174a0 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
174b0 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
174c0 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
174d0 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
174e0 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
174f0 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
17500 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17520 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
17530 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
17540 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
17550 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
17560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
17570 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
17580 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
17590 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
175a0 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
175b0 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
175c0 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
175d0 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
175e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
175f0 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
17600 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
17610 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
17620 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
17630 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
17640 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
17650 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
17660 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
17670 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
17680 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
17690 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
176a0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
176b0 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
176c0 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
176d0 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
176e0 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
176f0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
17700 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
17710 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
17720 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
17730 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
17740 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
17750 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
17760 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
17770 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
17780 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
17790 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
177a0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
177b0 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
177c0 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
177d0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
177e0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
177f0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
17800 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
17810 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
17820 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
17830 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
17840 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
17850 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
17860 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
17870 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
17880 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
17890 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
178a0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
178b0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
178c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
178d0 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
178e0 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
178f0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
17900 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
17910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17920 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
17930 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
17940 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
17950 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
17960 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
17970 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
17980 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
17990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
179a0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
179b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
179c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
179d0 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
17a00 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
17a10 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
17a20 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
17a30 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
17a40 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
17a50 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
17a60 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
17a70 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
17a80 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
17a90 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
17aa0 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
17ab0 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
17ac0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
17ad0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
17ae0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
17af0 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
17b00 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
17b10 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
17b20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
17b30 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
17b40 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
17b50 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
17b60 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
17b70 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
17b80 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
17b90 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
17ba0 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
17bb0 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
17bc0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
17bd0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
17be0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
17bf0 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
17c00 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
17c10 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
17c20 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
17c30 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
17c40 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
17c50 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
17c60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c80 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17c90 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
17ca0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
17cb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17cc0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
17cd0 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
17ce0 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
17cf0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
17d00 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
17d10 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
17d20 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
17d30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17d40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
17d50 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
17d60 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
17d70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
17d80 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
17d90 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
17da0 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
17db0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17dc0 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
17dd0 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
17de0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
17df0 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
17e00 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
17e10 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
17e20 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
17e30 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f      rc = winUnlo
17e40 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17e50 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
17e60 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
17e70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
17e80 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
17e90 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
17ea0 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
17eb0 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
17ec0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
17ed0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
17ee0 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
17ef0 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
17f00 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
17f10 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
17f20 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
17f30 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
17f40 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
17f50 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20  te, 0);.  }.  . 
17f60 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20   if( rc!= 0 ){. 
17f70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17f80 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
17f90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17fa0 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72   =  osGetLastErr
17fb0 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  or();.    rc = S
17fc0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
17fd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
17fe0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66  -LOCK file=%p, f
17ff0 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c  unc=%s, errno=%l
18000 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  u, rc=%s\n",.   
18010 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18020 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70  File.h, (lockTyp
18030 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29  e == _SHM_UNLCK)
18040 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c   ? "winUnlockFil
18050 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e" :.           
18060 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70  "winLockFile", p
18070 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
18080 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18090 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rc)));..  return
180a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
180b0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
180c0 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
180d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
180e0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
180f0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
18100 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
18110 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
18120 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
18130 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
18140 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
18150 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
18160 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
18170 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
18180 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
18190 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
181a0 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
181b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
181c0 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
181d0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
181e0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
181f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
18200 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
18210 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
18220 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
18230 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
18240 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
18250 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
18260 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20  Node *p;.  BOOL 
18270 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77  bRc;.  assert( w
18280 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
18290 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
182a0 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c  SHM-PURGE pid=%l
182b0 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64  u, deleteFlag=%d
182c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
182d0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
182e0 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46  essId(), deleteF
182f0 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77  lag));.  pp = &w
18300 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
18310 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
18320 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
18330 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
18340 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
18350 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
18360 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
18370 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
18380 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18390 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
183a0 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
183b0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
183c0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
183d0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
183e0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
183f0 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
18400 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
18410 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
18420 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
18430 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
18440 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
18450 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
18460 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
18470 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
18480 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
18490 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
184a0 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70  HM-PURGE-CLOSE p
184b0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
184c0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
184e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
184f0 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
18500 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
18510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18520 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21   if( p->hFile.h!
18530 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c  =NULL && p->hFil
18540 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  e.h!=INVALID_HAN
18550 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
18560 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18570 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18580 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
18590 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
185a0 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
185b0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
185c0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
185d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
185e0 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20  deleteFlag ){.  
185f0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18600 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
18620 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
18630 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44  ();.        winD
18640 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a  elete(pVfs, p->z
18650 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
18660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
18670 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
18680 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
18690 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
186a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
186b0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
186c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
186d0 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a  ee(p->aRegion);.
186e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
186f0 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(p);.    }else
18700 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d  {.      pp = &p-
18710 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
18720 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
18730 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
18740 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
18750 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
18760 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a  file pDbFd..**.*
18770 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
18780 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
18790 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
187a0 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
187b0 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
187c0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
187d0 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
187e0 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
187f0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
18800 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
18810 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
18820 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
18830 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
18840 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
18850 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61  c int winOpenSha
18860 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c  redMemory(winFil
18870 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
18880 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  uct winShm *p;  
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
188b0 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
188c0 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
188d0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
188e0 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  = 0;   /* The un
188f0 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
18900 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
18910 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18930 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
18940 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
18950 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  ode *pNew;      
18960 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
18970 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f  located winShmNo
18980 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  de */.  int nNam
18990 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
189a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
189b0 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
189c0 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ytes */..  asser
189d0 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
189e0 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
189f0 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
18a00 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18a10 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
18a20 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
18a30 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
18a40 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
18a50 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
18a60 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
18a70 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
18a80 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
18a90 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18aa0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
18ab0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
18ac0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18ad0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20  _NOMEM;.  nName 
18ae0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18af0 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
18b00 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
18b10 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
18b20 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
18b30 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20   nName + 17 );. 
18b40 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
18b50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18b60 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
18b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
18b80 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  EM;.  }.  pNew->
18b90 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
18ba0 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
18bb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
18bc0 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
18bd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
18be0 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
18bf0 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
18c00 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
18c10 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
18c20 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20  lename); ..  /* 
18c30 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
18c40 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
18c50 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
18c60 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
18c70 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
18c80 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
18c90 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
18ca0 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
18cb0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
18cc0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
18cd0 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
18ce0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
18cf0 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
18d00 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
18d10 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
18d20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
18d30 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
18d40 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
18d50 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
18d60 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
18d70 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
18d80 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
18d90 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
18da0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
18db0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
18dc0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
18dd0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
18de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
18df0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
18e00 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
18e10 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
18e20 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
18e30 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
18e40 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
18e50 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
18e60 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
18e70 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
18e80 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
18e90 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
18ea0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
18eb0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
18ec0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
18ed0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
18ee0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
18ef0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
18f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
18f10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
18f20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
18f30 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
18f40 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
18f50 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
18f60 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
18f70 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
18f80 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
18f90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18fa0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
18fb0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
18fc0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
18fd0 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
18fe0 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
18ff0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
19020 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
19030 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19040 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
19060 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
19070 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
19080 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
19090 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
190a0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
190b0 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
190c0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
190d0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
190e0 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
190f0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
19100 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
19110 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  th. .    */.    
19120 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  if( winShmSystem
19130 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
19140 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
19150 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
19160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19170 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
19180 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19190 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
191a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
191b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
191c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
191d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
191e0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
191f0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
19200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19210 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
19220 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
19230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
19260 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
19270 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
19280 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
19290 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
192a0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
192b0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
192c0 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
192d0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
192e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
192f0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
19300 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
19310 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
19320 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
19330 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
19340 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
19350 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
19360 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
19370 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
19380 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
19390 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
193a0 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
193b0 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
193c0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
193d0 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
193e0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
193f0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
19400 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
19410 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
19420 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
19430 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
19440 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
19450 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
19460 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
19470 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
19480 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
19490 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
194a0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
194b0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
194c0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
194d0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
194e0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
194f0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
19500 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
19510 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
19520 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
19530 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
19540 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
19550 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
19560 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
19570 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
19580 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
19590 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
195a0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
195b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
195c0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
195d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
195e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
195f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
19600 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
19610 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
19620 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
19630 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
19640 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
19650 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
19660 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
19670 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
19680 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
19690 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
196a0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
196b0 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
196c0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
196d0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
196e0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
196f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
19700 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
19710 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
19720 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
19730 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
19740 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
19750 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
19760 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
19770 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
19780 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
19790 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
197a0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
197b0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
197c0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
197d0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
197e0 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
197f0 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
19800 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
19810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
19820 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
19830 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
19840 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
19850 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
19860 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
19870 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19880 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
19890 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
198a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
198b0 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
198c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
198d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
198e0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
198f0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
19900 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
19910 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
19920 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
19930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19940 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
19950 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
19960 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
19970 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
19980 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
19990 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
199a0 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
199b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
199c0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
199d0 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
199e0 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
199f0 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
19a00 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
19a10 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
19a20 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
19a30 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
19a40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
19a50 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
19a60 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
19a70 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19a80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19a90 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
19aa0 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
19ab0 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
19ac0 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
19ad0 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
19ae0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
19af0 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
19b00 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
19b10 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
19b20 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
19b30 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
19b40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
19b50 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
19b60 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
19b70 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
19b80 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
19b90 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
19ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19bb0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
19bc0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
19bd0 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
19be0 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
19bf0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
19c00 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
19c10 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
19c20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
19c30 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
19c40 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
19c50 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c70 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
19c80 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
19c90 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
19cc0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
19cd0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
19ce0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
19cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
19d00 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
19d10 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
19d20 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
19d30 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
19d40 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
19d50 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
19d60 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
19d70 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
19d80 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
19d90 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
19da0 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
19db0 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
19dc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19df0 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
19e00 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
19e10 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
19e20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
19e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19e60 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19e90 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
19ea0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
19eb0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
19ec0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
19ed0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
19ee0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
19ef0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
19f00 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
19f10 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
19f20 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
19f30 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
19f40 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
19f50 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
19f60 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
19f70 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
19f80 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
19f90 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
19fa0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
19fb0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
19fc0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
19fd0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
19fe0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
19ff0 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1a000 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1a010 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1a020 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1a030 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1a040 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1a050 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1a060 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1a070 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a080 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1a090 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1a0a0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1a0b0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1a0c0 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1a0d0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a0e0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1a0f0 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1a100 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1a110 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1a120 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1a130 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1a140 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1a150 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1a160 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a170 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1a180 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1a190 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1a1a0 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1a1b0 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1a1c0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1a1d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1a1e0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1a1f0 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1a200 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1a210 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1a220 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1a230 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1a240 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1a250 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1a260 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1a270 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a280 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1a290 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1a2a0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1a2b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a2c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1a2d0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1a2e0 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1a2f0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1a300 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
1a310 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1a320 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1a330 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1a340 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1a350 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a360 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1a370 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1a380 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1a390 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1a3a0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1a3b0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1a3c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1a3d0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1a3e0 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1a3f0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a400 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1a410 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1a420 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1a430 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1a440 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1a450 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1a460 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1a470 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1a480 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1a490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a4a0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1a4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a4c0 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1a4d0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1a4e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1a4f0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1a500 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1a510 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1a520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a540 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1a550 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1a560 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1a570 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1a580 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1a590 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1a5a0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1a5b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1a5c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1a5d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1a5e0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1a5f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1a600 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a620 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1a630 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1a640 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1a650 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1a660 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1a670 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1a680 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1a690 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1a6a0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1a6b0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1a6c0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1a6d0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1a6e0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1a6f0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1a700 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1a710 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1a720 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
1a730 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1a740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1a750 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a770 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
1a780 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
1a790 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
1a7a0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
1a7b0 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
1a7c0 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
1a7d0 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1a7e0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1a7f0 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
1a800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a820 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1a830 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1a840 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
1a850 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1a860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1a870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1a890 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1a8a0 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1a8b0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1a8c0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1a8d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1a8e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a8f0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1a900 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1a910 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
1a920 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
1a930 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
1a940 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
1a950 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1a960 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1a970 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
1a980 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1a990 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
1a9a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
1a9b0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
1a9c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1a9d0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1a9e0 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1a9f0 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1aa00 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
1aa10 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1aa20 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1aa30 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1aa40 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1aa50 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1aa60 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1aa70 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1aa80 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1aa90 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1aaa0 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1aab0 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1aac0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1aad0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1aae0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1aaf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1ab00 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1ab10 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1ab20 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1ab30 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1ab40 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1ab50 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1ab60 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1ab70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ab80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ab90 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1aba0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1abb0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1abc0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1abd0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1abe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1abf0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1ac00 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1ac10 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1ac20 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1ac30 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1ac40 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1ac50 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1ac60 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1ac70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1ac80 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1ac90 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1aca0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1acb0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1acc0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1acd0 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1ace0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1acf0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1ad00 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1ad10 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1ad20 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1ad30 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1ad40 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1ad50 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1ad60 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1ad70 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1ad80 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1ad90 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
1ada0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1adb0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1adc0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1add0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1ade0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1adf0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1ae00 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1ae10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1ae20 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1ae30 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1ae40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1ae50 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1ae60 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1ae70 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1ae80 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1ae90 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1aea0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1aeb0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1aec0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1aed0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1aee0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1aef0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1af00 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1af10 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1af20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1af30 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1af40 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1af50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1af60 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1af70 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1af80 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1afb0 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1afc0 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1afe0 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1aff0 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1b020 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1b030 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1b040 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b060 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1b070 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1b080 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1b090 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1b0a0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1b0b0 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1b0c0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1b0d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b0e0 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1b0f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1b100 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1b110 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1b120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b130 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1b140 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1b150 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1b160 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1b170 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b180 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1b190 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1b1a0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1b1b0 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1b1c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1b1d0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1b1e0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1b1f0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1b200 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1b210 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1b220 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1b230 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1b240 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1b250 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1b260 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1b270 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1b280 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1b290 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1b2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1b2b0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1b2c0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1b2d0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1b2e0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1b2f0 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1b300 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1b310 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1b320 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1b330 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1b340 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1b350 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1b360 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1b370 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1b380 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1b390 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1b3a0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1b3b0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1b3c0 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1b3d0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1b3e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1b3f0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1b400 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1b410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b420 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1b430 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b440 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1b450 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b470 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
1b480 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1b490 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b4a0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
1b4b0 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
1b4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1b4d0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1b4e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1b4f0 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
1b500 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1b510 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
1b520 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1b530 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1b540 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b550 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1b560 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1b570 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
1b580 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
1b590 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1b5a0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1b5b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1b5c0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1b5d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b5e0 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
1b5f0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1b600 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1b610 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1b620 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1b630 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
1b640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b660 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1b670 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b680 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1b690 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1b6b0 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1b6c0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1b6d0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b6e0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1b6f0 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1b700 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1b710 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1b720 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1b730 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1b740 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1b750 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1b760 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1b770 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1b780 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1b790 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1b7a0 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1b7b0 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1b7c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b7d0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b7e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1b7f0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1b800 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1b810 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1b820 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1b830 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1b840 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1b850 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1b860 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1b870 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1b880 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1b890 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1b8a0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1b8b0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1b8c0 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  .     .#if SQLIT
1b8d0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1b8e0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1b8f0 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1b900 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  pp(pShmNode->hFi
1b910 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1b920 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1b930 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  RITE, nByte, NUL
1b940 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1b950 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b960 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1b970 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1b980 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b990 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
1b9a0 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1b9b0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1b9c0 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1b9d0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1b9e0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1b9f0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1ba00 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1ba10 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1ba20 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1ba30 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20  File.h, .       
1ba40 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1ba50 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1ba60 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1ba70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1ba80 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1ba90 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
1baa0 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
1bab0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1bad0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1bae0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1baf0 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1bb10 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
1bb20 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
1bb30 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
1bb40 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1bb50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1bb60 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1bb70 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1bb80 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1bb90 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1bba0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1bbb0 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
1bbc0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1bbd0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1bbe0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1bbf0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1bc00 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1bc10 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1bc20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
1bc30 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1bc40 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1bc50 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
1bc60 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
1bc70 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1bc80 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
1bc90 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1bca0 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1bcb0 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
1bcc0 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
1bcd0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
1bce0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
1bcf0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
1bd00 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1bd10 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  AP-MAP pid=%lu, 
1bd20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65  region=%d, offse
1bd30 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  t=%d, size=%d, r
1bd40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1bd50 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1bd60 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1bd70 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1bd80 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bda0 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
1bdb0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1bdc0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1bdd0 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
1bde0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1bdf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1be00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1be10 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1be20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1be30 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
1be40 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1be50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be60 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
1be70 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1be80 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
1be90 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
1bea0 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
1beb0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1bec0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1bed0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1bee0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1bef0 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
1bf00 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1bf10 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1bf20 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
1bf30 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
1bf40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1bf50 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
1bf60 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
1bf70 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1bf80 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
1bf90 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1bfa0 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
1bfb0 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
1bfc0 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1bfd0 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1bfe0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1bff0 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
1c000 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
1c010 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1c020 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
1c030 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
1c040 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
1c050 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
1c060 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1c070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c080 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1c090 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c0a0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
1c0b0 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
1c0c0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1c0d0 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
1c0e0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
1c0f0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
1c100 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
1c110 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1c120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1c130 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  AL */../*.** Cle
1c140 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65  ans up the mappe
1c150 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20  d region of the 
1c160 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
1c170 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53  if any..*/.#if S
1c180 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1c190 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
1c1a0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
1c1b0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
1c1c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
1c1d0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1c1e0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c1f0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68  %lu, pFile=%p, h
1c200 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  Map=%p, pMapRegi
1c210 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1c220 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c      "mmapSize=%l
1c230 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  ld, mmapSizeActu
1c240 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  al=%lld, mmapSiz
1c250 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  eMax=%lld\n",.  
1c260 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c270 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c280 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1c290 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  hMap, pFile->pMa
1c2a0 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  pRegion,.       
1c2b0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1c2c0 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ize, pFile->mmap
1c2d0 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c  SizeActual, pFil
1c2e0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29  e->mmapSizeMax))
1c2f0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ;.  if( pFile->p
1c300 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
1c310 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65   if( !osUnmapVie
1c320 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
1c330 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20  MapRegion) ){.  
1c340 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c350 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1c360 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1c370 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c380 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c390 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
1c3a0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
1c3b0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
1c3c0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
1c3d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c3e0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c400 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c410 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
1c420 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1c430 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1c440 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1c450 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1c460 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1c470 55 6e 6d 61 70 31 22 2c 20 70 46 69 6c 65 2d 3e  Unmap1", pFile->
1c480 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
1c490 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1c4a0 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
1c4b0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
1c4c0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1c4d0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
1c4e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
1c4f0 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
1c500 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
1c510 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
1c520 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
1c530 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1c540 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1c550 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1c560 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1c570 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1c580 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
1c590 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1c5a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c5b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c5c0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c5d0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
1c5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
1c5f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c600 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
1c610 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c630 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
1c640 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
1c650 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1c660 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
1c670 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1c680 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c690 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1c6a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1c6b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1c6c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1c6d0 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72  (), pFile));.  r
1c6e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c6f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
1c700 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
1c710 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
1c720 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1c730 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
1c740 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
1c750 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
1c760 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
1c770 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
1c780 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
1c790 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
1c7a0 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
1c7b0 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
1c7c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
1c7d0 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
1c7e0 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1c7f0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1c800 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c810 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1c820 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1c830 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1c840 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1c850 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1c860 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
1c870 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
1c880 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
1c890 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
1c8a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
1c8b0 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
1c8c0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1c8d0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1c8e0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
1c8f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
1c900 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
1c910 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
1c920 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
1c930 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
1c940 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
1c950 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1c960 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  E, whichever is 
1c970 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
1c980 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c990 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
1c9a0 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
1c9b0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
1c9c0 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
1c9d0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1c9e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1c9f0 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
1ca00 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
1ca10 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
1ca20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1ca30 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1ca40 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  pFd, sqlite3_int
1ca50 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c  64 nByte){.  sql
1ca60 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20  ite3_int64 nMap 
1ca70 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
1ca80 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
1ca90 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
1caa0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
1cab0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1cac0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1cad0 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c  e=%p, size=%lld\
1cae0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1caf0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1cb00 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79  ssId(), pFd, nBy
1cb10 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64  te));..  if( pFd
1cb20 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
1cb30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cb40 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
1cb50 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  ){.    rc = winF
1cb60 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1cb70 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61  _file*)pFd, &nMa
1cb80 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
1cb90 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1cba0 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1cbb0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1cbc0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
1cbd0 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  TAT\n",.        
1cbe0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1cbf0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1cc00 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74  pFd));.      ret
1cc10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1cc20 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
1cc30 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
1cc40 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
1cc50 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
1cc60 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1cc70 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71  }.  nMap &= ~(sq
1cc80 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e  lite3_int64)(win
1cc90 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1cca0 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28  ze - 1);. .  if(
1ccb0 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
1ccc0 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1ccd0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1cce0 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
1ccf0 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
1cd00 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
1cd10 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
1cd20 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
1cd30 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
1cd40 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
1cd50 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
1cd60 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1cd70 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
1cd80 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
1cd90 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
1cda0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1cdb0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1cdc0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
1cdd0 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
1cde0 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
1cdf0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1ce00 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1ce10 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1ce20 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
1ce30 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1ce40 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
1ce50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1ce60 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1ce70 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
1ce80 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1ce90 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
1cea0 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1cee0 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1cef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1cf20 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1cf30 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1cf40 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1cf50 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
1cf60 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1cf70 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1cf80 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1cf90 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1cfc0 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1cfd0 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1d000 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1d010 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
1d020 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
1d030 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
1d040 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1d050 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1d060 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1d070 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d080 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1d090 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0b0 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1d0c0 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  le", pFd->zPath)
1d0d0 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1d0e0 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1d0f0 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1d100 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1d110 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1d120 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1d130 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1d140 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d150 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1d160 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
1d170 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d180 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d190 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
1d1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d1b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d1c0 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79  t( (nMap % winSy
1d1d0 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1d1e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
1d1f0 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1d200 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1d210 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
1d220 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
1d230 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d240 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
1d250 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1d260 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70  romApp(pFd->hMap
1d270 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a  , flags, 0, (SIZ
1d280 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65  E_T)nMap);.#else
1d290 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1d2a0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
1d2b0 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1d2c0 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1d2d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1d2e0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
1d2f0 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
1d300 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
1d310 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
1d320 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
1d330 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1d340 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1d350 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
1d360 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d370 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
1d380 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1d390 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1d3a0 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  ile", pFd->zPath
1d3b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1d3c0 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
1d3d0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d3e0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1d3f0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1d400 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d410 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d420 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20  (), pFd));.     
1d430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d440 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
1d450 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
1d460 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
1d470 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
1d480 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1d490 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
1d4a0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1d4b0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1d4c0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1d4d0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1d4e0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d4f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d500 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
1d510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1d520 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
1d530 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
1d540 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
1d550 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
1d560 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
1d570 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
1d580 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
1d590 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
1d5a0 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
1d5b0 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
1d5c0 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
1d5d0 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
1d5e0 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
1d5f0 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
1d600 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
1d610 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1d620 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
1d630 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
1d640 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
1d650 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
1d660 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
1d670 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1d680 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
1d690 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1d6a0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
1d6b0 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
1d6c0 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
1d6d0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1d6e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
1d6f0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
1d700 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
1d710 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
1d720 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
1d730 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
1d740 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
1d750 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
1d760 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
1d770 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1d780 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
1d790 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
1d7a0 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
1d7b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1d7c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1d7d0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1d7e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1d7f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1d800 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
1d810 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1d820 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
1d830 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1d840 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
1d850 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
1d860 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d870 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d880 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
1d890 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
1d8a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1d8b0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
1d8c0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
1d8d0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
1d8e0 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
1d8f0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1d900 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
1d910 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d930 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1d940 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1d950 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1d960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d970 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d980 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1d990 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1d9a0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1d9b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d9c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1d9d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
1d9e0 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
1d9f0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
1da00 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1da10 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
1da20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
1da30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1da40 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1da50 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1da60 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
1da70 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
1da80 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1da90 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1daa0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1dab0 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
1dac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dad0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1dae0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1daf0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
1db00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1db10 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
1db20 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
1db30 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1db40 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
1db50 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
1db60 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1db70 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1db80 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
1db90 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
1dba0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
1dbb0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
1dbc0 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
1dbd0 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
1dbe0 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
1dbf0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1dc00 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1dc10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1dc20 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
1dc30 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
1dc40 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
1dc50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
1dc60 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
1dc70 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
1dc80 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
1dc90 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
1dca0 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
1dcb0 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
1dcc0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1dcd0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
1dce0 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
1dcf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1dd00 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1dd10 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1dd20 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1dd30 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1dd40 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
1dd50 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
1dd60 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
1dd70 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1dd80 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1dd90 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
1dda0 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
1ddb0 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
1ddc0 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
1ddd0 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
1dde0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1ddf0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
1de00 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
1de10 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
1de20 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
1de30 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
1de40 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
1de50 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
1de60 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
1de70 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
1de80 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1de90 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
1dea0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
1deb0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1dec0 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1ded0 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
1dee0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1def0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1df00 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
1df10 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
1df20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
1df30 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
1df40 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
1df50 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
1df60 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
1df70 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
1df80 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
1df90 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
1dfa0 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
1dfb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
1dfc0 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
1dfd0 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
1dfe0 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62  essary can can b
1dff0 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
1e000 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
1e010 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
1e020 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
1e030 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1e040 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e050 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
1e060 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
1e070 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1e080 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e090 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1e0a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e0b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e0c0 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
1e0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e0e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
1e0f0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1e100 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1e110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1e120 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1e130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1e140 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1e150 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1e160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e170 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1e180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1e1d0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
1e1e0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
1e1f0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
1e200 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
1e210 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
1e220 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
1e230 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1e240 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
1e250 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1e280 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
1e290 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e2b0 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
1e2c0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
1e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1e2e0 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
1e2f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e300 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1e310 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
1e320 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1e330 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1e340 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
1e350 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1e360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
1e370 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
1e380 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1e390 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1e3a0 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
1e3b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1e3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1e3d0 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
1e3e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1e3f0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1e400 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
1e410 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
1e420 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
1e430 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
1e440 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
1e450 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e460 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
1e470 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
1e480 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1e490 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
1e4a0 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
1e4b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1e4c0 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
1e4d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1e4e0 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
1e4f0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
1e500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e510 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
1e520 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1e530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e540 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
1e550 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
1e560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e570 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
1e580 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
1e5b0 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
1e5e0 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
1e610 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
1e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e660 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1e670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
1e680 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
1e690 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1e6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1e6b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
1e6c0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1e6d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1e6e0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
1e6f0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
1e700 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
1e710 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
1e720 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
1e730 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
1e740 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1e750 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1e760 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
1e770 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
1e780 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
1e790 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
1e7a0 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
1e7b0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1e7c0 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
1e7d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1e7e0 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76  ic void *winConv
1e7f0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e800 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e810 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
1e820 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
1e830 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
1e840 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
1e850 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
1e860 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1e870 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1e880 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e890 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1e8a0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1e8b0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1e8c0 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1e8d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1e8e0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1e8f0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1e900 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1e910 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1e920 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1e930 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1e940 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1e950 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1e960 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1e970 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e980 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e990 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
1e9a0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1e9b0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1e9c0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
1e9d0 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1e9e0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1e9f0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
1ea00 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
1ea10 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
1ea20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
1ea30 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69  size_t i, j;.  i
1ea40 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20  nt nTempPath;.  
1ea50 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 53  char zTempPath[S
1ea60 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
1ea70 50 41 54 48 5f 42 59 54 45 53 2b 32 5d 3b 0a 0a  PATH_BYTES+2];..
1ea80 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
1ea90 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
1eaa0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
1eab0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
1eac0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
1ead0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
1eae0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
1eaf0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
1eb00 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
1eb10 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
1eb20 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
1eb30 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1eb40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
1eb50 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
1eb60 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1eb70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1eb80 73 6e 70 72 69 6e 74 66 28 53 51 4c 49 54 45 5f  snprintf(SQLITE_
1eb90 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
1eba0 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61  YTES-30, zTempPa
1ebb0 74 68 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  th, "%s",.      
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ebd0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1ebe0 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20  ctory);.  }.#if 
1ebf0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
1ec00 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73  .  else if( osIs
1ec10 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
1ec20 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
1ec30 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 53 51  HAR zWidePath[SQ
1ec40 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
1ec50 41 54 48 5f 43 48 41 52 53 5d 3b 0a 20 20 20 20  ATH_CHARS];.    
1ec60 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
1ec70 68 57 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  hW(SQLITE_WIN32_
1ec80 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2d 33  MAX_PATH_CHARS-3
1ec90 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  0, zWidePath)==0
1eca0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1ecb0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
1ecc0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
1ecd0 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
1ece0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ecf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
1ed00 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 20 20 7d  TTEMPPATH;.    }
1ed10 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69  .    zMulti = wi
1ed20 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
1ed30 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
1ed40 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
1ed50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1ed60 6e 74 66 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ntf(SQLITE_WIN32
1ed70 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2d  _MAX_PATH_BYTES-
1ed80 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
1ed90 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
1eda0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1edb0 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65  (zMulti);.    }e
1edc0 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  lse{.      OSTRA
1edd0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
1ede0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
1edf0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
1ee00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ee10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1ee20 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
1ee30 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
1ee40 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
1ee50 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
1ee60 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
1ee70 74 68 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  th[SQLITE_WIN32_
1ee80 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 5d 3b  MAX_PATH_BYTES];
1ee90 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
1eea0 6d 70 50 61 74 68 41 28 53 51 4c 49 54 45 5f 57  mpPathA(SQLITE_W
1eeb0 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
1eec0 54 45 53 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74  TES-30, zMbcsPat
1eed0 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  h)==0 ){.      O
1eee0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
1eef0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
1ef00 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
1ef10 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
1ef20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ef30 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a  RR_GETTEMPPATH;.
1ef40 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20      }.    zUtf8 
1ef50 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1ef60 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
1ef70 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
1ef80 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
1ef90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1efa0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1efb0 58 5f 50 41 54 48 5f 42 59 54 45 53 2d 33 30 2c  X_PATH_BYTES-30,
1efc0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
1efd0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
1efe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
1eff0 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
1f000 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f010 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
1f020 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
1f030 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
1f040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f050 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1f060 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6c 73  .  }.#else.  els
1f070 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e{.    /*.    **
1f080 20 43 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f 75   Compiled withou
1f090 74 20 41 4e 53 49 20 73 75 70 70 6f 72 74 20 61  t ANSI support a
1f0a0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  nd the current o
1f0b0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
1f0c0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 57 69      ** is not Wi
1f0d0 6e 64 6f 77 73 20 4e 54 3b 20 74 68 65 72 65 66  ndows NT; theref
1f0e0 6f 72 65 2c 20 6a 75 73 74 20 7a 65 72 6f 20 74  ore, just zero t
1f0f0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  he temporary buf
1f100 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
1f110 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68  memset(zTempPath
1f120 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
1f130 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
1f140 2b 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  +2);.  }.#endif 
1f150 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
1f160 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6c 73  HAS_ANSI */.#els
1f170 65 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  e.  else{.    /*
1f180 0a 20 20 20 20 2a 2a 20 43 6f 6d 70 69 6c 65 64  .    ** Compiled
1f190 20 66 6f 72 20 57 69 6e 52 54 20 61 6e 64 20 74   for WinRT and t
1f1a0 68 65 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  he sqlite3_temp_
1f1b0 64 69 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74  directory is not
1f1c0 20 73 65 74 3b 0a 20 20 20 20 2a 2a 20 74 68 65   set;.    ** the
1f1d0 72 65 66 6f 72 65 2c 20 6a 75 73 74 20 7a 65 72  refore, just zer
1f1e0 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
1f1f0 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
1f200 20 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50     memset(zTempP
1f210 61 74 68 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  ath, 0, SQLITE_W
1f220 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
1f230 54 45 53 2b 32 29 3b 0a 20 20 7d 0a 23 65 6e 64  TES+2);.  }.#end
1f240 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
1f250 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 20  _WINRT */..  /* 
1f260 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
1f270 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
1f280 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
1f290 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1f2a0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
1f2b0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
1f2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1f2d0 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50  R..  */.  nTempP
1f2e0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ath = sqlite3Str
1f2f0 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29  len30(zTempPath)
1f300 3b 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d 70 50  ;..  if( (nTempP
1f310 61 74 68 20 2b 20 73 71 6c 69 74 65 33 53 74 72  ath + sqlite3Str
1f320 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
1f330 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
1f340 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a   18) >= nBuf ){.
1f350 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
1f360 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
1f370 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
1f380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f390 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
1f3a0 20 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74    for(i=nTempPat
1f3b0 68 3b 20 69 3e 30 20 26 26 20 77 69 6e 49 73 44  h; i>0 && winIsD
1f3c0 69 72 53 65 70 28 7a 54 65 6d 70 50 61 74 68 5b  irSep(zTempPath[
1f3d0 69 2d 31 5d 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20  i-1]); i--){}.  
1f3e0 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
1f3f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1f400 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
1f410 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20  Buf, (nTempPath 
1f420 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  > 0) ?.         
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1f440 73 25 73 22 20 53 51 4c 49 54 45 5f 54 45 4d 50  s%s" SQLITE_TEMP
1f450 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53  _FILE_PREFIX : S
1f460 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1f470 50 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20  PREFIX,.        
1f480 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
1f490 50 61 74 68 2c 20 77 69 6e 47 65 74 44 69 72 44  Path, winGetDirD
1f4a0 65 70 28 29 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  ep());.  j = sql
1f4b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
1f4c0 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
1f4d0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
1f4e0 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
1f4f0 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
1f500 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
1f510 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
1f520 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
1f530 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
1f540 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
1f550 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
1f560 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20  ;.  zBuf[j+1] = 
1f570 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
1f580 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
1f590 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
1f5a0 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
1f5b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f5c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
1f5d0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1f5e0 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
1f5f0 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
1f600 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
1f610 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
1f620 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1f630 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
1f640 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
1f650 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
1f660 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
1f670 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1f680 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
1f690 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
1f6a0 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
1f6b0 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
1f6c0 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
1f6d0 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
1f6e0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
1f6f0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
1f700 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
1f710 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
1f720 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
1f730 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1f740 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1f750 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
1f760 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1f770 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
1f780 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
1f7b0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
1f7c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
1f7f0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
1f800 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1f810 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
1f820 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f830 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
1f840 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
1f850 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
1f860 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
1f870 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
1f880 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
1f890 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
1f8a0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1f8b0 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
1f8c0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
1f8d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
1f8e0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
1f8f0 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
1f900 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
1f910 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
1f920 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1f930 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1f940 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
1f950 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f960 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ,        /* Not 
1f970 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
1f980 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
1f990 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f9a0 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
1f9b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1f9c0 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
1f9d0 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
1f9e0 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
1f9f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
1fa00 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1fa10 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
1fa20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
1fa30 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
1fa40 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
1fa50 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
1fa60 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
1fa70 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1fa80 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
1fa90 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
1faa0 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
1fab0 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
1fac0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
1fad0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
1fae0 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
1faf0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fb00 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
1fb10 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
1fb20 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
1fb30 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
1fb40 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1fb50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1fb60 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
1fb70 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
1fb80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
1fb90 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
1fba0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
1fbb0 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
1fbc0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
1fbd0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
1fbe0 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
1fbf0 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
1fc00 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
1fc10 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
1fc20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1fc30 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
1fc40 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
1fc50 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
1fc60 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
1fc70 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e[SQLITE_WIN32_M
1fc80 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2b 32 5d  AX_PATH_BYTES+2]
1fc90 3b 20 2f 2a 20 42 75 66 66 65 72 20 66 6f 72 20  ; /* Buffer for 
1fca0 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
1fcb0 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
1fcc0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1fcd0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
1fce0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
1fcf0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1fd00 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
1fd10 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
1fd20 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
1fd30 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
1fd40 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
1fd50 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
1fd60 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
1fd70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1fd80 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
1fd90 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
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 44 45 4c 45 54 45  LITE_OPEN_DELETE
1fdc0 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
1fdd0 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
1fde0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1fdf0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
1fe00 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
1fe10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1fe20 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1fe30 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
1fe40 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
1fe50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1fe60 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
1fe70 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
1fe80 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
1fe90 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
1fea0 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
1feb0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1fec0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
1fed0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1fee0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1fef0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
1ff00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
1ff10 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
1ff20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
1ff30 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
1ff40 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
1ff50 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
1ff60 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
1ff70 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
1ff80 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
1ff90 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
1ffa0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
1ffb0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
1ffc0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
1ffd0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
1ffe0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
1fff0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
20000 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
20010 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
20020 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
20030 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
20040 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
20050 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
20060 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
20070 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
20080 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
20090 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
200a0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
200b0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
200c0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
200d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
200e0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
200f0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
20100 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
20110 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
20120 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
20130 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
20140 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
20150 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
20160 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
20170 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
20180 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
20190 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
201a0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
201b0 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
201c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
201d0 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
201e0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
201f0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
20200 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
20210 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
20220 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
20230 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
20240 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
20250 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
20260 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
20270 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
20280 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
20290 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
202a0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
202b0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
202c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
202d0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
202e0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
202f0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
20300 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
20310 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
20320 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
20330 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
20340 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
20350 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
20360 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
20370 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
20380 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20390 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
203a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
203b0 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
203c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
203d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
203e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
203f0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
20400 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
20410 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20420 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
20430 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
20440 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
20450 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
20460 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20470 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
20480 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
20490 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
204a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
204b0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
204c0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
204d0 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
204e0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
204f0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
20500 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
20510 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
20520 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
20530 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
20540 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
20550 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
20560 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
20570 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
20580 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
20590 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
205a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
205b0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
205c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
205d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
205e0 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
205f0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
20600 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
20610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
20620 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
20630 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
20640 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
20650 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
20660 47 65 74 54 65 6d 70 6e 61 6d 65 28 53 51 4c 49  GetTempname(SQLI
20670 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
20680 48 5f 42 59 54 45 53 2b 32 2c 20 7a 54 6d 70 6e  H_BYTES+2, zTmpn
20690 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
206a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
206b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
206c0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
206d0 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
206e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
206f0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
20700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20710 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
20720 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
20730 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
20740 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
20750 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
20760 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
20770 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
20780 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
20790 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
207a0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
207b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
207c0 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
207d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
207e0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
207f0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
20800 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
20810 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
20820 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
20830 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
20840 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
20850 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
20860 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
20870 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
20880 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
20890 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 55  ed = winConvertU
208a0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
208b0 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
208c0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
208d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
208e0 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
208f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20900 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
20910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20920 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
20930 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
20940 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
20950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
20960 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
20970 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
20980 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
20990 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
209a0 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65  SDIR", zUtf8Name
209b0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
209c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
209d0 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
209e0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
209f0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
20a00 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
20a10 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
20a20 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
20a30 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
20a40 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
20a50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
20a60 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
20a70 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
20a80 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
20a90 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63   file is .  ** c
20aa0 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
20ab0 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
20ac0 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
20ad0 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20  sive access" .  
20ae0 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
20af0 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
20b00 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
20b10 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
20b20 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
20b30 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
20b40 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
20b50 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
20b60 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
20b70 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
20b80 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
20b90 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
20ba0 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
20bb0 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
20bc0 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
20bd0 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
20be0 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
20bf0 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
20c00 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
20c10 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
20c20 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
20c30 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
20c40 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
20c50 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
20c60 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
20c70 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
20c80 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
20c90 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
20ca0 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
20cb0 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
20cc0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
20cd0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
20ce0 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
20cf0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
20d00 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
20d10 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
20d20 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
20d30 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
20d40 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
20d50 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
20d60 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
20d90 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
20dc0 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
20dd0 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
20de0 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
20df0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
20e00 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
20e10 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
20e20 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
20e30 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
20e40 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
20e50 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
20e60 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
20e70 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
20e80 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
20e90 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
20ea0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
20eb0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
20ec0 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
20ed0 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
20ee0 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
20ef0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
20f00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
20f10 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
20f20 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
20f30 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
20f40 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
20f50 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
20f60 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
20f70 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
20f80 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
20f90 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
20fa0 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
20fb0 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
20fc0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
20fd0 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
20fe0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
20ff0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
21000 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
21010 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
21020 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
21030 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
21040 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
21050 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
21060 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
21070 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
21080 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
21090 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
210a0 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
210b0 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
210c0 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
210d0 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
210e0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
210f0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
21100 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
21110 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21130 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
21140 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21160 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
21190 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
211a0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
211d0 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
211e0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
21210 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
21220 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
21230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21240 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
21250 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
21260 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
21270 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
21280 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
212b0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
212e0 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
21310 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
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 20 20 20 20 20 20 64 77 46               dwF
21340 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
21350 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
21380 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
213b0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
213c0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
213d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
213e0 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
213f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
21400 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
21410 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
21420 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
21430 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28  = osCreateFileA(
21440 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74  (LPCSTR)zConvert
21450 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
21480 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
214b0 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
214e0 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
21510 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
21540 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
21550 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
21580 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
21590 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
215a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
215b0 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  op */.    }.  }.
215c0 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49  #endif.  winLogI
215d0 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
215e0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c  TRACE(("OPEN fil
215f0 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61  e=%p, name=%s, a
21600 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73  ccess=%lx, rc=%s
21610 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
21620 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77  e,.           dw
21630 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28  DesiredAccess, (
21640 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
21650 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
21660 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
21670 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
21680 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
21690 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
216a0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
216b0 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
216c0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
216d0 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  N, pFile->lastEr
216e0 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20  rno, "winOpen", 
216f0 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20  zUtf8Name);.    
21700 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21710 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66  nverted);.    if
21720 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
21730 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
21740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
21750 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
21760 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
21770 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
21780 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
21790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217a0 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
217b0 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
217c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
217d0 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
217e0 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
217f0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
21800 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
21810 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
21820 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
21830 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
21840 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
21850 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
21860 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
21870 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
21880 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
21890 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
218a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
218b0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
218c0 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
218d0 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
218e0 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
218f0 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
21900 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
21910 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
21920 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
21930 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
21940 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
21950 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
21960 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
21970 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
21980 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
21990 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
219a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
219b0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
219c0 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
219d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
219e0 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
219f0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
21a00 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
21a10 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
21a20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
21a30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21a40 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21a50 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
21a60 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65  PEN-CE-LOCK name
21a70 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a  =%s, rc=%s\n", z
21a80 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Name, sqlite3Err
21a90 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
21aa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21ab0 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
21ac0 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
21ad0 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
21ae0 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
21af0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
21b00 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
21b10 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 70  erted);.  }..  p
21b20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
21b30 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &winIoMethod;.  
21b40 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56  pFile->pVfs = pV
21b50 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  fs;.  pFile->h =
21b60 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64   h;.  if( isRead
21b70 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c  only ){.    pFil
21b80 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
21b90 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  WINFILE_RDONLY;.
21ba0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
21bb0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e  3_uri_boolean(zN
21bc0 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c  ame, "psow", SQL
21bd0 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
21be0 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
21bf0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
21c00 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57   |= WINFILE_PSOW
21c10 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
21c20 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
21c30 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  ROR;.  pFile->zP
21c40 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66  ath = zName;.#if
21c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21c60 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d  _SIZE>0.  pFile-
21c70 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
21c80 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
21c90 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  n = 0;.  pFile->
21ca0 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
21cb0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
21cc0 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69  ctual = 0;.  pFi
21cd0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
21ce0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
21cf0 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
21d00 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  ndif..  OpenCoun
21d10 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
21d20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
21d30 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
21d40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
21d50 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f   that Windows do
21d60 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
21d70 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
21d80 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
21d90 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
21da0 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
21db0 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
21dc0 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
21dd0 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
21de0 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
21df0 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
21e00 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
21e10 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
21e20 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
21e30 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
21e40 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
21e50 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
21e60 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
21e70 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
21e80 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
21e90 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
21ea0 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
21eb0 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
21ec0 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
21ed0 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
21ee0 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
21ef0 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
21f00 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
21f10 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
21f20 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
21f30 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
21f40 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
21f50 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
21f60 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
21f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
21f80 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
21f90 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21fa0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
21fb0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
21fc0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
21fd0 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
21fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
21ff0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
22000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
22010 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
22020 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44   DWORD attr;.  D
22030 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
22040 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
22050 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
22060 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
22070 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22080 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
22090 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
220a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
220b0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54  R_DELETE);.  OST
220c0 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
220d0 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25  me=%s, syncDir=%
220e0 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  d\n", zFilename,
220f0 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a   syncDir));..  z
22100 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
22110 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
22120 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
22130 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
22140 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
22150 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
22160 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
22170 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
22180 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
22190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
221a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
221b0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
221c0 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
221d0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
221e0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
221f0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
22200 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
22210 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
22220 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
22230 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
22240 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
22250 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
22260 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
22270 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
222a0 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
222b0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
222c0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
222d0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
222e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
222f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
22300 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
22310 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
22320 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
22330 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
22340 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
22350 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
22360 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
22370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22380 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
22390 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
223a0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
223b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
223c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
223d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
223e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
223f0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
22400 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
22410 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
22420 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
22430 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
22440 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
22450 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
22460 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
22470 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
22480 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
22490 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
224a0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
224b0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
224c0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
224d0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
224e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
224f0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
22500 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
22510 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
22520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
22540 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
22550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
22570 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
22580 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
22590 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
225a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
225b0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
225c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
225d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
225e0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
225f0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
22600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22610 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
22620 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
22630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
22640 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
22650 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
22660 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
22670 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22680 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
22690 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
226a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
226b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
226c0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
226d0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
226e0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
226f0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
22700 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
22710 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
22720 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
22730 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
22740 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
22750 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
22760 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
22770 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
22780 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
22790 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
227a0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
227b0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
227c0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
227d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
227e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
227f0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
22800 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
22810 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
22820 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22830 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22860 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
22870 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
22880 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
22890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
228a0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
228b0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
228c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
228d0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
228e0 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
228f0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
22900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
22910 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
22920 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
22930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22940 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
22950 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
22960 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
22970 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
22980 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
22990 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
229a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
229b0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
229c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
229d0 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
229e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
229f0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
22a00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
22a10 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
22a20 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  E, lastErrno,.  
22a30 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44             "winD
22a40 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
22a50 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
22a60 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
22a70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
22a80 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22a90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
22aa0 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
22ab0 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
22ac0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
22ad0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
22ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22af0 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
22b00 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
22b10 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
22b20 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
22b30 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
22b40 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
22b50 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
22b60 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
22b70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
22b80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22b90 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
22ba0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22bc0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
22bd0 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
22be0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
22bf0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
22c00 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
22c10 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
22c20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
22c30 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
22c40 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a  Errno;.  void *z
22c50 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
22c60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
22c70 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
22c80 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
22c90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
22ca0 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  ESS; );.  OSTRAC
22cb0 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
22cc0 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52  %s, flags=%x, pR
22cd0 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20  esOut=%p\n",.   
22ce0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
22cf0 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  e, flags, pResOu
22d00 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  t));..  zConvert
22d10 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 55  ed = winConvertU
22d20 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
22d30 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
22d40 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
22d50 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43     OSTRACE(("ACC
22d60 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ESS name=%s, rc=
22d70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22d80 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  EM\n", zFilename
22d90 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
22da0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22db0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
22dc0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
22dd0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
22de0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
22df0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
22e00 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
22e10 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
22e20 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
22e30 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
22e40 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
22e50 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
22e60 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
22e90 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
22ea0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
22ed0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
22ee0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
22ef0 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
22f00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
22f10 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
22f20 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
22f30 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
22f40 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
22f50 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
22f60 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
22f70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
22f80 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
22f90 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
22fa0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
22fb0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
22fc0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
22fd0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
22fe0 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
22ff0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
23000 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
23010 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
23020 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
23030 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
23040 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
23050 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
23060 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f  {.      winLogIo
23070 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20  err(cnt);.      
23080 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45  if( lastErrno!=E
23090 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
230a0 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f  UND && lastErrno
230b0 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  !=ERROR_PATH_NOT
230c0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
230d0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
230e0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
230f0 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
23100 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65  inAccess", zFile
23110 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  name);.        s
23120 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23130 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
23140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
23150 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
23160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23170 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
23180 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
23190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
231a0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
231b0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
231c0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
231d0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
231e0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
231f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
23200 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
23210 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
23220 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
23230 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
23240 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
23250 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
23260 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
23270 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
23280 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
23290 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
232a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
232b0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
232c0 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
232d0 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
232e0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
232f0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
23300 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
23310 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
23320 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
23330 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
23340 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
23350 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
23360 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
23370 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
23380 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
23390 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52  CESS name=%s, pR
233a0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
233b0 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
233c0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
233d0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52     zFilename, pR
233e0 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
233f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23400 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
23410 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
23420 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
23430 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
23440 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
23450 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
23460 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
23470 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
23480 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
23490 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
234a0 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
234b0 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
234c0 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
234d0 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
234e0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
234f0 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
23500 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
23510 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
23520 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
23530 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
23540 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
23550 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
23560 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
23570 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
23580 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
23590 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
235a0 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
235b0 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
235c0 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
235d0 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
235e0 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
235f0 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
23600 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
23610 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
23620 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
23630 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
23640 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
23650 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
23660 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
23670 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
23680 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
23690 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
236a0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
236b0 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
236c0 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
236d0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
236e0 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
236f0 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
23700 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a   ( winIsDirSep(z
23710 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  Pathname[0]) ){.
23720 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
23730 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
23740 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
23750 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c   starts with a l
23760 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f  etter and a colo
23770 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61  n it is either a
23780 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c   volume.  ** rel
23790 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e  ative path or an
237a0 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20   absolute path. 
237b0 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   Callers of this
237c0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e   function must n
237d0 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20  ot.  ** attempt 
237e0 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61  to treat it as a
237f0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
23800 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73  ame (i.e. they s
23810 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65  hould simply use
23820 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69  .  ** it verbati
23830 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  m)..  */.  if ( 
23840 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
23850 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
23860 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
23870 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
23880 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
23890 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74    ** If we get t
238a0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
238b0 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  e path name shou
238c0 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ld almost certai
238d0 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a  nly be a purely.
238e0 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e    ** relative on
238f0 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e  e (i.e. not a UN
23900 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f  C name, not abso
23910 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f  lute, and not vo
23920 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a  lume relative)..
23930 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41    */.  return FA
23940 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  LSE;.}../*.** Tu
23950 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
23960 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
23970 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
23980 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
23990 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
239a0 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
239b0 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
239c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
239d0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
239e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
239f0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
23a00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
23a10 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
23a20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
23a30 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
23a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
23a50 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
23a60 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
23a70 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
23a80 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
23ab0 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
23ac0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
23ad0 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
23ae0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
23af0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
23b00 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
23b10 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
23b20 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
23b30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
23b40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23b50 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
23b60 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
23b70 74 68 6e 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 57  thname>=SQLITE_W
23b80 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
23b90 54 45 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TES );.  assert(
23ba0 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
23bb0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
23bc0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
23bd0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
23be0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
23bf0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
23c00 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
23c10 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
23c20 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
23c30 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
23c40 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
23c50 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
23c60 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
23c70 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
23c80 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
23c90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
23ca0 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
23cb0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
23cc0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
23cd0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
23ce0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
23cf0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
23d00 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
23d10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
23d20 72 20 7a 4f 75 74 5b 53 51 4c 49 54 45 5f 57 49  r zOut[SQLITE_WI
23d30 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
23d40 45 53 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 63  ES+1];.    if( c
23d50 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
23d60 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
23d70 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c  _A|CCP_RELATIVE,
23d80 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
23d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23da0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
23db0 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
23dc0 5f 42 59 54 45 53 2b 31 29 3c 30 20 29 7b 0a 20  _BYTES+1)<0 ){. 
23dd0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
23de0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
23df0 5f 46 55 4c 4c 50 41 54 48 2c 20 28 44 57 4f 52  _FULLPATH, (DWOR
23e00 44 29 65 72 72 6e 6f 2c 20 22 63 79 67 77 69 6e  D)errno, "cygwin
23e10 5f 63 6f 6e 76 5f 70 61 74 68 22 2c 0a 20 20 20  _conv_path",.   
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
23e30 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 20  Relative);.     
23e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23e50 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
23e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23e70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
23e80 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
23e90 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
23ea0 2c 20 22 25 73 25 73 25 73 22 2c 0a 20 20 20 20  , "%s%s%s",.    
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
23ed0 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
23ee0 69 72 44 65 70 28 29 2c 20 7a 4f 75 74 29 3b 0a  irDep(), zOut);.
23ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23f00 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
23f10 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  h(CCP_POSIX_TO_W
23f20 49 4e 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c  IN_A, zRelative,
23f30 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30   zFull, nFull)<0
23f40 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
23f50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
23f60 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
23f70 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 20 22 63  (DWORD)errno, "c
23f80 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 22  ygwin_conv_path"
23f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23fa0 20 20 20 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a      zRelative);.
23fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23fc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
23fd0 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 7d  LPATH;.    }.  }
23fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23ff0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
24000 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
24010 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
24020 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
24030 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
24040 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
24050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24060 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
24070 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
24080 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
24090 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
240a0 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
240b0 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
240c0 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
240d0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
240e0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
240f0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
24100 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
24110 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
24120 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
24130 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
24140 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
24150 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
24160 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
24170 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
24180 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
24190 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
241a0 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
241b0 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
241c0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
241d0 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
241e0 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
241f0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
24200 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
24210 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
24220 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
24230 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
24240 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
24250 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
24260 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
24270 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
24280 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
24290 20 22 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20   "%s%s%s",.     
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
242c0 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
242d0 72 44 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rDep(), zRelativ
242e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
242f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24300 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
24310 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
24320 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
24330 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
24340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24350 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
24360 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
24370 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
24380 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
24390 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52  CYGWIN__).  DWOR
243a0 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  D nByte;.  void 
243b0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
243c0 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a  har *zOut;..  /*
243d0 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61   If this path na
243e0 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
243f0 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20  /X:", where "X" 
24400 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69  is any alphabeti
24410 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  c.  ** character
24420 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e  , discard the in
24430 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74  itial "/" from t
24440 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a  he pathname..  *
24450 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  /.  if( zRelativ
24460 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c  e[0]=='/' && sql
24470 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c  ite3Isalpha(zRel
24480 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65  ative[1]) && zRe
24490 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29  lative[2]==':' )
244a0 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b  {.    zRelative+
244b0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27  +;.  }..  /* It'
244c0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
244d0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
244e0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
244f0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
24500 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
24510 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
24520 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
24530 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
24540 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
24550 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
24560 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
24570 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
24580 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
24590 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
245a0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
245b0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
245c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
245d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
245e0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28  _ERROR );.  if (
245f0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
24600 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
24610 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
24620 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
24630 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
24640 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
24650 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
24660 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
24670 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
24680 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
24690 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
246a0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
246b0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
246c0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
246d0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
246e0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
246f0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
24700 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
24710 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
24720 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
24730 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
24740 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
24750 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
24760 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
24770 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
24780 75 6c 6c 2c 20 22 25 73 25 73 25 73 22 2c 0a 20  ull, "%s%s%s",. 
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
247b0 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
247c0 65 74 44 69 72 44 65 70 28 29 2c 20 7a 52 65 6c  etDirDep(), zRel
247d0 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75  ative);.    retu
247e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
247f0 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  }.  zConverted =
24800 20 77 69 6e 43 6f 6e 76 65 72 74 55 74 66 38 46   winConvertUtf8F
24810 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
24820 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
24830 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
24840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
24850 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
24860 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
24870 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
24880 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
24890 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
248a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
248b0 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
248c0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
248d0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
248e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
248f0 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  OR, osGetLastErr
24900 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
24910 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c          "GetFull
24920 50 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43 6f  PathNameW1", zCo
24930 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
24940 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24950 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
24960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
24970 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b  NTOPEN_FULLPATH;
24980 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
24990 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
249a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
249b0 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
249c0 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
249d0 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
249e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
249f0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24a00 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
24a10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
24a20 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
24a30 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
24a40 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
24a50 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
24a60 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
24a70 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
24a80 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
24a90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
24aa0 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
24ab0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
24ac0 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
24ad0 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a 43  lPathNameW2", zC
24ae0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24af0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24b00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
24b20 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
24b30 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24b40 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
24b50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
24b60 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24b70 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55  .    zOut = winU
24b80 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
24b90 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
24ba0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
24bb0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
24bc0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
24bd0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
24be0 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
24bf0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
24c00 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
24c10 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
24c20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
24c30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69  e==0 ){.      wi
24c40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
24c50 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73  _ERROR, osGetLas
24c60 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
24c70 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74              "Get
24c80 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c  FullPathNameA1",
24c90 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
24ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24cb0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24cd0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
24ce0 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ATH;.    }.    n
24cf0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
24d00 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
24d10 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
24d20 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
24d30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
24d40 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
24d50 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
24d60 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
24d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
24d80 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
24d90 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
24da0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
24db0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
24dc0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
24dd0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
24de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  ==0 ){.      win
24df0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24e00 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74  ERROR, osGetLast
24e10 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
24e20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46             "GetF
24e30 75 6c 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c 20  ullPathNameA2", 
24e40 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24e50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24e60 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24e70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24e80 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
24e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
24ea0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20  OPEN_FULLPATH;. 
24eb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24ec0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24ed0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
24ee0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
24ef0 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
24f00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24f10 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
24f20 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
24f30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
24f40 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
24f50 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
24f60 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
24f70 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
24f80 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
24f90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24fa0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
24fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24fc0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24fd0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
24fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24ff0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
25000 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
25010 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
25020 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
25030 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
25040 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
25050 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
25060 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
25070 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
25080 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
25090 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
250a0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
250b0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
250c0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
250d0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
250e0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
250f0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
25100 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
25110 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
25120 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
25130 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
25140 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
25150 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
25160 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69  *zConverted = wi
25170 6e 43 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  nConvertUtf8File
25180 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
25190 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
251a0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
251b0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
251c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
251d0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
251e0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
251f0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
25200 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
25210 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
25220 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
25230 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
25240 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
25250 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
25260 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
25270 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
25280 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
25290 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
252a0 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
252b0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
252c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
252d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
252e0 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
252f0 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
25300 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
25310 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
25320 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
25330 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
25340 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25350 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65  R(pVfs);.  winGe
25360 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
25370 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
25380 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
25390 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
253a0 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
253b0 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20  _vfs *pVfs,void 
253c0 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *pH,const char *
253d0 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
253e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
253f0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
25400 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
25410 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
25420 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53  A((HANDLE)pH, zS
25430 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
25440 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
25450 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25460 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
25470 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25480 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46  TER(pVfs);.  osF
25490 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44  reeLibrary((HAND
254a0 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  LE)pHandle);.}.#
254b0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
254c0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
254d0 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
254e0 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
254f0 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
25500 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
25510 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
25520 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
25530 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
25540 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
25550 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
25560 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
25570 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
25580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
25590 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
255a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
255b0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
255c0 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Buf){.  int n = 
255d0 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
255e0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
255f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
25600 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66  TEST).  n = nBuf
25610 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
25620 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65   0, nBuf);.#else
25630 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
25640 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
25650 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
25660 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74  IME x;.    osGet
25670 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a  SystemTime(&x);.
25680 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
25690 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  [n], &x, sizeof(
256a0 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  x));.    n += si
256b0 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69  zeof(x);.  }.  i
256c0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
256d0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
256e0 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65  DWORD pid = osGe
256f0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
25700 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
25710 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
25720 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
25730 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
25740 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  d);.  }.#if SQLI
25750 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
25760 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f  ( sizeof(ULONGLO
25770 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  NG)<=nBuf-n ){. 
25780 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74     ULONGLONG cnt
25790 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
257a0 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  t64();.    memcp
257b0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
257c0 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
257d0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
257e0 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  cnt);.  }.#else.
257f0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
25800 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
25810 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
25820 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
25830 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
25840 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
25850 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
25860 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
25870 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
25880 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
25890 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
258a0 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
258b0 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
258c0 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
258d0 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65  nter(&i);.    me
258e0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
258f0 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20  i, sizeof(i));. 
25900 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69     n += sizeof(i
25910 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
25920 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
25930 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
25940 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
25950 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
25960 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
25970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
25980 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  nSleep(sqlite3_v
25990 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69  fs *pVfs, int mi
259a0 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74  crosec){.  sqlit
259b0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28  e3_win32_sleep((
259c0 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
259d0 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
259e0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
259f0 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
25a00 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
25a10 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
25a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
25a30 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
25a40 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
25a50 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
25a60 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
25a70 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
25a80 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
25a90 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
25aa0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
25ab0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
25ac0 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
25ad0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
25ae0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
25af0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
25b00 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
25b10 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
25b20 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
25b30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
25b40 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
25b50 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
25b60 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
25b70 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
25b80 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
25b90 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
25ba0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
25bb0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
25bc0 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
25bd0 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
25be0 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
25bf0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
25c00 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
25c10 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
25c20 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
25c30 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
25c40 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
25c50 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
25c60 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
25c70 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
25c80 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
25c90 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
25ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25cb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
25cc0 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
25cd0 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
25ce0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
25cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25d00 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
25d10 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
25d20 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
25d30 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
25d40 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
25d50 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
25d60 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
25d70 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
25d80 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
25d90 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
25da0 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
25db0 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
25dc0 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
25dd0 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
25de0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
25df0 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
25e00 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
25e10 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
25e20 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
25e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
25e40 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
25e50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
25e60 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
25e70 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
25e80 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
25e90 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
25ea0 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
25eb0 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
25ec0 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
25ed0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
25ee0 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
25ef0 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
25f00 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
25f10 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
25f20 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
25f30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
25f40 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
25f50 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
25f60 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
25f70 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
25f80 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
25f90 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
25fa0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
25fb0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
25fc0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
25fd0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
25fe0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
25ff0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
26000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
26010 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
26020 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
26030 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
26040 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
26050 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
26060 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
26070 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
26080 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
26090 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
260a0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
260b0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
260c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
260d0 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
260e0 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
260f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
26100 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
26110 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
26120 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
26130 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
26140 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
26150 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
26160 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
26170 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
26180 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
26190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
261a0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
261b0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
261c0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
261d0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
261e0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
261f0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
26200 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
26210 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
26220 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
26230 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
26240 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
26250 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
26260 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
26270 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
26280 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
26290 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
262a0 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  prNow){.  int rc
262b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
262c0 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43  4 i;.  rc = winC
262d0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
262e0 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28  pVfs, &i);.  if(
262f0 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e   !rc ){.    *prN
26300 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
26310 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
26330 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68   idea is that th
26340 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
26350 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61  s like a combina
26360 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61  tion of.** GetLa
26370 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f  stError() and Fo
26380 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e  rmatMessage() on
26390 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72   Windows (or err
263a0 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72  no and.** strerr
263b0 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e  or_r() on Unix).
263c0 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   After an error 
263d0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  is returned by a
263e0 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  n OS.** function
263f0 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  , SQLite calls t
26400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  his function wit
26410 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20  h zBuf pointing 
26420 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f  to.** a buffer o
26430 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68  f nBuf bytes. Th
26440 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c  e OS layer shoul
26450 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a  d populate the.*
26460 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20  * buffer with a 
26470 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  nul-terminated U
26480 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72  TF-8 encoded err
26490 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65  or message.** de
264a0 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73  scribing the las
264b0 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61  t IO error to ha
264c0 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68  ve occurred with
264d0 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  in the calling.*
264e0 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  * thread..**.** 
264f0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  If the error mes
26500 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  sage is too larg
26510 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69  e for the suppli
26520 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74  ed buffer,.** it
26530 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
26540 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e  ated. The return
26550 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61   value of xGetLa
26560 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65  stError.** is ze
26570 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
26580 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
26590 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
265a0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
265b0 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
265c0 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
265d0 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  ed). If non-zero
265e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
265f0 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
26600 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63  necessary to inc
26610 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  lude the nul-ter
26620 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
26630 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70  r.** in the outp
26640 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ut buffer..**.**
26650 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61   Not supplying a
26660 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
26670 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76  will have no adv
26680 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f  erse effect.** o
26690 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20  n SQLite. It is 
266a0 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20  fine to have an 
266b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
266c0 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74  hat never.** ret
266d0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  urns an error me
266e0 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  ssage:.**.**   i
266f0 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  nt xGetLastError
26700 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
26710 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
26720 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20  ar *zBuf){.**   
26730 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d    assert(zBuf[0]
26740 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20  =='\0');.**     
26750 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d  return 0;.**   }
26760 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69  .**.** However i
26770 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
26780 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ge is supplied, 
26790 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72  it will be incor
267a0 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71  porated.** by sq
267b0 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72  lite into the er
267c0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69  ror message avai
267d0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
267e0 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  r using.** sqlit
267f0 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73  e3_errmsg(), pos
26800 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20  sibly making IO 
26810 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f  errors easier to
26820 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69   debug..*/.stati
26830 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
26840 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
26850 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
26860 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
26870 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26880 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
26890 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  rn winGetLastErr
268a0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
268b0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
268c0 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  uf);.}../*.** In
268d0 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
268e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
268f0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
26900 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
26910 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
26920 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
26930 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
26940 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
26970 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
26980 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
26990 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
269a0 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
269b0 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
269c0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
269f0 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20     "win32",     
26a00 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
26a10 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a30 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
26a40 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
26a50 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
26a60 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
26a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
26a80 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
26a90 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
26aa0 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
26ab0 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
26ac0 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
26ad0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
26ae0 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
26af0 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
26b00 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
26b10 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
26b20 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
26b30 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
26b40 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
26b50 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
26b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
26b70 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
26b80 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
26b90 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
26ba0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
26bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26bc0 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
26bd0 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
26be0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
26bf0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
26c00 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
26c10 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
26c20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
26c30 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
26c40 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
26c50 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
26c60 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
26c70 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
26c80 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
26c90 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
26ca0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
26cb0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
26cc0 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
26cd0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
26ce0 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65   };..  /* Double
26cf0 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  -check that the 
26d00 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79  aSyscall[] array
26d10 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72   has been constr
26d20 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65  ucted.  ** corre
26d30 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65  ctly.  See ticke
26d40 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65  t [bb3a86e890c8e
26d50 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72  96ab] */.  asser
26d60 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79  t( ArraySize(aSy
26d70 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b 0a 0a 20  scall)==74 );.. 
26d80 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d   /* get memory m
26d90 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72  ap allocation gr
26da0 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d  anularity */.  m
26db0 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66  emset(&winSysInf
26dc0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53  o, 0, sizeof(SYS
26dd0 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20  TEM_INFO));.#if 
26de0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
26df0 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73    osGetNativeSys
26e00 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
26e10 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  nfo);.#else.  os
26e20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  GetSystemInfo(&w
26e30 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64  inSysInfo);.#end
26e40 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  if.  assert( win
26e50 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
26e60 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e  tionGranularity>
26e70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  0 );.  assert( w
26e80 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
26e90 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c  Size>0 );..  sql
26ea0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
26eb0 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20  r(&winVfs, 1);. 
26ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26ed0 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  K; .}..int sqlit
26ee0 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
26ef0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
26f00 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
26f10 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
26f20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
26f30 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
26f40 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
26f50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
26f60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26f70 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
26f80 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.